暂无图片
Mysql SQL索引优化group by求思路
我来答
分享
佳佳
2021-09-01
Mysql SQL索引优化group by求思路

mysql遇到一个问题:

select * from table where A=1 and B between 20210802 and 20210901 group by C;

像这种SQL,如何加索引最好?

1.假如加(A,B,C)索引,虽然满足最左原则,但是group by C不能用索引消除,会产生Using temporary; Using filesort

2.假如加(C,A,B)索引,然后用索引消除了排序,但是不满足最左原则,过滤性很查,只能走个ICP

我来答
添加附件
收藏
分享
问题补充
2条回答
默认
最新
chengang

先单看(C,A,B) 这个索引。因为A是等值查询。所以A,C,B 即能让A走上索引查询,也能将就C排序,可以两全其美。

但具体哪个索引更好,还是要在区分度与排序上做一个选择。

暂无图片 评论
暂无图片 有用 0
暂无图片
薛晓刚

如果你AB两个条件控制的数据量少,比如几百条。排序就排序吧。
看你的意思是要查一个月。那么你的A确定可以过滤很多吗?比如是银行流水。A是客户号,一个月就几百也就这样了。按照金额排序也行。
但是如果你A是返回几十万,那么就不好。
主要看看A的选择上。重点在A是什么。

暂无图片 评论
暂无图片 有用 1
佳佳
题主
2021-09-01
A过滤的一点都不多,B过滤的很多。那么就是说(C,A,B)更好咯,优先消除排序? 执行的时间来看,(A,B,C)是0.24s ; (C,A,B)是0.31s group by之前的行数是118187行,group by之后的行数是5198行。
佳佳
题主
2021-09-01
所以,遇到这类情况,就是权衡 过滤的价值大?还是排序的价值大?是吧
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏