MySQL: 如果group by的元素中缺失where后一个字段的情况下如何建立索引?

下面这个mysql语句如何建立索引? (id, type, age, date) 不对吧, (id, age, date) 感觉也不行?

select * from a where id=3 and type='fruit' group by id,age,date order by age, date
阅读 3.4k
3 个回答

最简单的就是你创建一下,使用explain关键字看一下就知道了。

(id, type, age, date) 、(id, age, date)都不能包含想要的索引列,所以不能这样建立。
可以建两个索引,一个包含where条件,一个包含group by字段, 但这条SQL比较极端, 根据id其实已经锁定了数据行,再建立索引的意义不大。建立的索引供你参考
image.png

你确定这个sql不会报错吗?很奇怪用groupby不用聚合函数的意义在哪 。。。改写一下

select age,date,count(1) cnt from a where id=3 and type='fruit' group by id,age,date order by age, date

可以尝试建立索引(id,type,age,date) 条件列表(id、type)符合这个索引的最左等值匹配,image.png
这里画个图说明一下这个索引的结构,先根据id排序,id相同根据type排序,类推,最终当确定id和type后实际上order by age,date不需要做额外操作,只需要从type的最小扫描到type的最大,扫描到的数据就是需要的数据了,最后group by由于你条件列表写了id=xxx, 那么groupby语句里的id应该会被mysql进行优化,去掉你这个id,最后实际上groupby的列表是age和date,参考orderby,这个索引同样能对这个groupby有效果 。。。以上,纯属猜测 ,楼主不妨听听1楼的答案用explain自己试试 如果我猜测有误还请告诉我一下谢谢哈

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题