下面这个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
下面这个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
(id, type, age, date) 、(id, age, date)都不能包含想要的索引列,所以不能这样建立。
可以建两个索引,一个包含where条件,一个包含group by字段, 但这条SQL比较极端, 根据id其实已经锁定了数据行,再建立索引的意义不大。建立的索引供你参考
你确定这个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)符合这个索引的最左等值匹配,
这里画个图说明一下这个索引的结构,先根据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自己试试 如果我猜测有误还请告诉我一下谢谢哈
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
最简单的就是你创建一下,使用
explain
关键字看一下就知道了。