作为一个“出色“的mysql程序员,大家都知道mysql 建立了索引,会大幅度提升查询速度。mysql 查询优化器会自动选择最优的查询方案,但有时候mysql的选择其实不是最优的。
现有一张zeng_order表,created_date字段和store_id字段建立了索引
现有查询条情况
- 查询1
select count(*) as aggregate from `zeng_order` where `created_date` between '2020-12-23' and '2020-12-23'
查询结果集 53540条数据量,耗时0.015秒
- 查询2
select count(*) as aggregate from `zeng_order` where `store_id` = 3
查询结果集5232567条数据量,耗时1.7秒
- 查询3
select count(*) as aggregate from `zeng_order` where `created_date` between '2020-12-23' and '2020-12-23' and `store_id` = 3
查询结果集26775条数据量,耗时2.025秒
- 查询4
在(查询3)的基础上忽略store_id索引
select count(*) as aggregate from `zeng_order` ignore index(idx_store_id) where `created_date` between '2020-12-23' and '2020-12-23' and `store_id` = 3
查询结果集26775条数据量,耗时0.1秒
- 查询5 (在查询3的基础上忽略created_date索引)
select count(*) as aggregate from `zeng_order` ignore index(idx_created_date) where `created_date` between '2020-12-23' and '2020-12-23' and `store_id` = 3
查询结果集26775条数据量,耗时0.1秒
通过对比,使用了created_date和store_id查询条件,2个索引生效的情况下,查询速度反而更慢,(查询4)中忽略了store_id索引,反而大幅度提升查询效率。
底层原理有待查询相关知识验证,目前解释起来有点吃力,先记录问题。