查看执行时走的索引:
explain SELECT count(*)
FROM tb_task
WHERE create=0 and create_time < '2017-07-10 22:00:00' ;
结果:
+----+-------------+-------------+-------+-------------------------+------------+---------+------+------+-----------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra +----+-------------+-------------+-------+-------------------------+------------+---------+------+------+-----------+
如果没有走 key=null 或者不是自己预想的索引!
此时可以强制指定走索自己建立的 force index(idx_create_time)
explain SELECT count(*) FROM tb_task force index(idx_create_time)
WHERE create=0 and create_time < '2017-07-10 22:00:00' ;
如果key依然不是自己指定的索引!!就有问题了
原因:
堆积量太大 MySQL内部计算cost 走索引不合理(因为:
正常的数据量超过20%的全表数据对于走索引反而是更不好的)
解决方案:
清洗掉索引键命中的脏数据或者无效的数据!