如题
我执行一段查询语句,用5.6的时候用时6s多,用5.7用时4分钟,将5.7安装在ssd分区上的话,时间有很大提升,查询用时30秒左右。
服务器是同一台,内存64G,数据30万,时间上怎么会差这么多?
有没有哪位大神了解这方面的知识,麻烦解惑一下5.7的性能瓶颈是在哪里。附上sql:
SELECT
count(1)
FROM
(
SELECT
a.id AS ruleId,
a.name AS ruleName,
a.score,
a.rNumber,
b.realRNumber
FROM
(
SELECT
r.id,
r.name,
r.score,
count(r.id) AS rNumber
FROM
 c
LEFT JOIN  r ON r.ID = c.ID
WHERE
r.id IS NOT NULL
AND c.c_time >= STR_TO_DATE(
'2016-08-17 00:00:00',
'%Y-%m-%d %H:%i:%s'
)
AND c.c_time <= (
STR_TO_DATE(
'2016-08-17 
23:59:59',
'%Y-%m-%d %H:%i:%s'
)
)
GROUP BY
r.id,
r.name,
r.score
) a
LEFT JOIN (
SELECT
count(r.id) AS rNumber,
r.id,
r.name,
r.score
FROM
 c
LEFT JOIN  r ON r.ID = c.ID
WHERE
r.id IS NOT NULL
AND c.c_time >= STR_TO_DATE(
'2016-08-17 
00:00:00',
'%Y-%m-%d %H:%i:%s'
)
AND c.c_time <= (
STR_TO_DATE(
'2016-08-17 23:59:59',
'%Y-%m-%d 
%H:%i:%s'
)
)
AND c.R_TIVE = '1'
GROUP BY
r.id,
r.name,
r.score
) b ON a.id = b.id
AND a.name = b.name
AND a.score = b.score
) a

解决方案 »

  1.   

    索引没加上吧
    直接查数量
    用这个 SELECT
    DISTINCT(r.id,r.name,r.score) AS cnt
    FROM
     c
    JOIN  r ON r.ID = c.ID
    WHERE
    AND c.c_time >= STR_TO_DATE('2016-08-17 00:00:00','%Y-%m-%d %H:%i:%s')
    AND c.c_time <= STR_TO_DATE('2016-08-17 23:59:59','%Y-%m-%d %H:%i:%s')
      

  2.   


    还有一点,新出的版本最好先别用,因为可能会有不少bug,等出来稳定版后再用,坑不少
      

  3.   

    看到这种SQL真是够了。左连接套左连接。
      

  4.   


    5.6和5.7的差异不好说,但是既然一个快,一个慢,肯定是在优化器方面 有改进,但是改进的具体方面,你可以参考一下mysql的官方文档,但是官方文档也只是说明了可能的差异,具体如何解决这种差异,你还是得自己分析执行计划。