Group by 造成 Using Temporary; Using Filesort

山里的孩子 发布于 2016/05/30 18:40
阅读 2K+
收藏 0

SQL:

SELECT
    o.id, p.id,
    SUM(IF(o.a=0, p.b, 0)) AS 'b0',
    SUM(IF(o.a=1, p.b, 0)) AS 'b1'
FROM
    o LEFT JOIN p ON p.id=p.o_id
WHERE 
    o.a BETWEEN 0 AND 1
GROUP BY p.id

EXPLAIN:

*************************** 1. row ***************************
                id: 1
   select_type: SIMPLE
            table: o
             type: range
possible_keys: a
              key: a
        key_len: 4
              ref: NULL
            rows: 1
            Extra: Using index condition; Using where; Using temporary; Using filesort *************************** 2. row ***************************
                id: 1
   select_type: SIMPLE
            table: p
             type: ref
possible_keys: o_id
              key: o_id
         key_len: 3
               ref: o.o_id
             rows: 1
            Extra:

请问各位如何优化?万分感谢

加载中
0
乌龟壳
乌龟壳

p.id = p.o_id

语句是不是写错了?

乌龟壳
乌龟壳
回复 @山里的孩子 : O
山里的孩子
山里的孩子
回复 @乌龟壳 : 呃,没说完, 慢的是前一条分页sql,漏写了关联条件了。
乌龟壳
乌龟壳
回复 @山里的孩子 : 原来如此
山里的孩子
山里的孩子
回复 @乌龟壳 : 结果是我判断错了。这个SQL没那么慢。还能接受。
乌龟壳
乌龟壳
回复 @山里的孩子 : stackoverflow什么结果?
下一页
0
o
oneflower
o表的o.a,o.id跟p表的p.b,p.id加上索引

参考自:MySQL如何优化GROUP BY
0
山里的孩子
山里的孩子

引用来自“oneflower”的评论

o表的o.a,o.id跟p表的p.b,p.id加上索引

参考自:MySQL如何优化GROUP BY

呃,这和索引没多大关系吧?(需要的索引都有了)

我是想问能不能改写成其它形式,实现相同功能。

不过还是谢谢。

0
mark35
mark35
看到Using Filesort就知道是mysql。 (除了BAT这种级别公司)mysql上面没啥可优化的,直接升级服务器磁盘IO能力效果最好
山里的孩子
山里的孩子
升级硬件不现实。 现在在做统计,写了很长的SQL, 精简成上面这样的示例。并且数据量不大。但是查询非常慢。
0
乌龟壳
乌龟壳
http://www.cnblogs.com/wangxusummer/p/5329085.html
返回顶部
顶部