我有一个关于使用" group by"的问题在mysql中:组顺序是否影响查询效率。
1.SELECT SQL_NO_CACHE `er_ct`, `appve` FROM TBL_547 WHERE UAEWA_ts >= 1417276800 AND UAEWA_ts <= 1417449540 GROUP BY `appve`, `er_ct` ORDER BY `c79fd348-cc8e-41f2-ae93-0b2b2cde8a31` DESC limit 5;
2.SELECT SQL_NO_CACHE `er_ct`, `appve` FROM TBL_547 WHERE UAEWA_ts >= 1417276800 AND UAEWA_ts <= 1417449540 GROUP BY `er_ct`,`appve` ORDER BY `c79fd348-cc8e-41f2-ae93-0b2b2cde8a31` DESC limit 5;
两个句子之间的差异是&#34; GROUP BY appve
,er_ct
&#34;和&#34; GROUP BY er_ct
,appve
&#34;。在appve和er_ct上没有索引(组合索引)。 &#34; SELECT COUNT(DISTINCT er_ct)FROM TBL_547&#34;的值是#。&#34; SELECT COUNT(DISTINCT appve)FROM TBL_547&#34;是3。
这是截图。 http://i.stack.imgur.com/AeQy2.png
结构:http://i.stack.imgur.com/ewgAy.png
感谢。
答案 0 :(得分:0)
使用group by在列上创建索引不会提升结果。执行查询时,首先将SQL语句编译为关系代数运算树。这些操作每个都将一个或多个表作为输入,并生成另一个表作为输出。然后使用输出表SQL引擎应用任何其他操作: - agregation - group by - 排序
因此,您可以通过以下方式提升查询: - 创建智能查询,例如仅在索引列上。 - 确保您的结果集不是很大,并且不能访问所有连接的列,例如Select *,这对生产来说是一种过度杀伤
我还建议SQL Tuning作为讲座。我希望我的回答会有所帮助。
首先想到我脑子里的流行音乐是两列中不同结果的大小,你提到3和7k,这是我假设的主要因素。 当查询优化器(它们一直在变化)时会看到第一个组列很小,它只会跟随流程,但如果他看到第一列很大(7k个不同的结果),他可以继续构建一个它的索引。大型列上的操作可能很慢,这就是为什么两个查询都有两个不同的时间。