MySQL百万级数据检索
msyql表数据达800多万,表中多个字段建立索引,某些字段为复合索引,在执行某个sql个时候,时间达到8秒,实在是不能忍,线上切个分页都是很慢,仔细研究后发现,索引没问题,sql写的有问题。
索引信息如下
原sql
select * from table where DATE_FORMAT(createtime,’%Y-%m-%d’) = #createTime#
根据索引信息显示,这种写法肯定是不走索引的。第一,运用了DATE_FORMAT函数,对索引字段运用函数导致索引失效。第二,图中的复合索引为status和createtime的复合索引,需满足最左原则,sql中无status的条件查询,失效。
修改后
select * from table where creatime BETWEEN CONCAT(#createtime#, ’ 00:00:00’) AND CONCAT(#createtime#, ’ 23:59:59’) AND status in (0,1,2)
修改后的sql是走索引的,去掉了函数,并且增加了status的查询条件。
总结
复合索引满足最左原则,首先给索引字段套用函数,肯定是会导致索引失效的,其次,若不想加入复合索引的另一个字段,则可以修改复合索引的顺序,如图中status在前createtime在后,若查询条件只有status,则是走索引的。