mysql 查询优化器并非万能

作为一个“出色“的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索引,反而大幅度提升查询效率。

底层原理有待查询相关知识验证,目前解释起来有点吃力,先记录问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值