MySQL - 将5.5.27升级到5.7

时间:2017-09-15 08:53:02

标签: mysql sql query-performance mysql-5.7 mysql-slow-query-log

我正在处理一个Query,它会检索服务报告列表及其详细信息。该查询还通过输入' - '来返回数据库中缺少的服务报告。在详细信息列中。花了一些时间后,我想出了这样的查询: -

select   
     22000+n as sSrn ,IFNULL(m.mType,'---')  machineType,  ifnull(c.custName,'---') as customerName,     IFNULL(sDos,'---')  DateOfService , IFNULL(sSrgd,'---') AS ServiceRptDate ,IFNULL(sTechnician,'---') AS  technician ,IFNULL( CAST(sPcdescription AS char(100))  ,'---') AS  remarks , IFNULL( CAST(m.machineID AS char(100))  ,'---') AS  machineID
from
    (
     SELECT  @curRow := @curRow + 1 AS n
     FROM     service CROSS JOIN  dummytable
     JOIN    (SELECT @curRow := 0) r
    ) numbergen
LEFT JOIN service  s ON sSrn = 22000+n
LEFT JOIN machine m ON s.machineID = m.machineID    
LEFT JOIN customer c ON c.custID = m.custID
LIMIT 0,10

查询实际上会生成一个包含大量行的表,并将其与服务表数据进行比较。如果服务号码不是连续的,它将生成缺少的报告编号' - '作为其他列。完成了理想的结果,就像这样。

enter image description here

但问题是,当我将MySQL版本升级到5.7时,与5.5.27相比,查询执行速度非常慢(5.5.27也提供了平均性能,但仍可使用。)) 例如:

5.5.27 MySQL已经过去了

秒:1.48秒** enter image description here 5.7 MySQL已经过了几秒钟:14.960秒 enter image description here

请告知如何提高MySQL 5.7或SQL中的查询性能。

注意:我也明白基于第一列的自动排序不能在5.7上工作,这导致我在查询中输入一个订单,这会导致更多的延迟。

更新: EXPLAIN for 5.5.27版本 enter image description here

EXPLAIN for 5.7版 enter image description here

1 个答案:

答案 0 :(得分:0)

10倍的性能差异就像缓存与非缓存一样。每次运行两次定时测试;忽略第一个。 (这假设您没有打开查询缓存。)如果不是,请为两个版本提供EXPLAIN SELECT ...

因为你可能正在使用"序列"经常,为什么不建立一个数字为1的永久表...(一些大的值)。然后你可以说FROM numbers ... WHERE n BETWEEN 1 AND 10(并离开LIMIT)。

如果你使用的是MariaDB,那表'表'可以通过伪表seq_1_to_10动态生成。或者,或许更好:seq_22001_to_22010并避开22000+