环境 mysql 5.7
存储引擎 InnoDB
1.原由
前段时间在本地批量处理数据,单表有100W左右。但是处理中有出错的情况。所以就删了重新导入,来来回回处理了很多次。后来发现在查询时非常的慢。
2.找问题
最开始以为时left join的问题,查看的执行计划都走了索引,没觉得有多大问题。但是查询就是非常的慢,在多次尝试下发现单表count都慢的过分。一个单表count可能需要执行好几分钟甚至更久。
后来在请教了一些大佬之后,得到了解决方案。
表碎片太多,可以尝试重建索引或者,修复表。
3.解决
执行表碎片整理语句
-- t_27是表名
ALTER TABLE t_27 ENGINE = Innodb
整个碎片整理花了2800s左右
执行前的索引文件400MB,数据文件400MB,单表count一直在执行,没有得到结果
执行后的索引文件200MB,数据文件200MB,单表count第一次3.8s,第二次因为查询缓存0.1s
提升非常的明显。
4.感谢
感谢各位大佬的指点,感谢MySQL表的碎片整理和空间回收小结的文章