mysql中同时存在where 和group by时,索引生效是怎样的?

譬如如下语句

select user_id,sum(age) from table where date > '2020-02-14' and date < '2020-03-01' group by user_id

假如建了三个索引 index_user_id, index_user_id_date, index_date,

理想状况是使用index_user_id_date这个索引,但是执行流程是先执行where,后执行group by,所以不行,不知道有什么方法可以改变mysql执行顺序吗?

用explain却发现使用了index_user_id这个索引,但是我的理解是,根据执行流程,先执行where,后执行group by,执行where后筛选剩下的数据行进行group by是不可能使用到index_user_id这个索引,怎么回事呢?

阅读 7k
2 个回答

可以开启OPTIMIZER_TRACE看一下,可能是使用index_user_id的成本最低,优化器就选择这个索引了

索引使用

MySQL优化器是选择最优解,不是非要使用某个索引。

explain结果使用index_user_id索引,说明MySQL判断使用该索引查询速度最快,如果你明确Mysql判断错误,可强制使用索引

条件date > '2020-02-14' and date < '2020-03-01',如果查询出来的数据量很少,就使用索引index_date,反之可能扫描索引index_user_id更快

比如你要从一堆球中找出白球,如果是999个白球+1个黑球组成,最快的方法是找出黑球,重要的是最快找到最优解,而不是查询方法

optimizer_trace

追踪SQL语句优化解析的过程

SET optimizer_trace="enabled=on";

强制使用索引
select user_id,sum(age) from table 
FORCE INDEX(`index_user_id_date`)
where date > '2020-02-14' and date < '2020-03-01' group by user_id
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题