前言
当数据库存储数据为千万级别的时候,查询数据总数耗时大概为10秒以上。页面上出现查询速度缓慢,后端现象提示sql返回超时。
为了处理大表查询问题,可以采取以下两种方式:
- 分表
- 减少存储,建立索引
出现的问题
表数据过大,但是数据并不是所有都会用到,这个时候可以删除无用的数据。
在java中设置每天的定时任务,在业务低峰期通过循环删除不需要的数据,直到循环删除完成返回结果为0时跳出循环,删除完成。
删除大数据,例如1000w的数据,这个时候mysql表并不会释放之前数据占用的空间。
通过查看表信息时,之前mysql被删除的数据以及索引仍然占用空间,虽然新加的数据会利用这部分空间,但是部分碎片不会清理
解决方法
1、使用 【OPTIMIZE TABLE 你的表】,以下简称‘OPT’
- 使用OPT出现阻塞其它sql执行,业务高峰期执行会导致查询失败,或者接口返回失败
- OPT会深度清理表空间以及表的碎片,将之前删除数据占用的空间和索引重新整理
- OPT命令在表数据千万级别时严重耗时,建议档表数据量小的时候整理
2、使用 【ALTER TABLE 你的表 ENGINE=INNODB;】 - 此命令不会阻塞其它sql
- 此命令不会深度清理碎片,但是可以基本达到OPT命令一样的效果
- 以六千万级别的数据为例,耗时大概在4小时左右
- 可以重复执行,重复执行会重新清理表碎片
最终方案
1.定期在低业务期间使用【ALTER TABLE 你的表 ENGINE=INNODB;】清理碎片,释放数据库资源
2.在建立表格时候一定要对字段加索引,了解表存储的内容,当为千万级或者以上数据时考虑分表
3.查询数据太慢,如果只是统计数据,建议将数据库存储改为es存储