首页 文章

MySQL - 将5.5.27升级到5.7的性能问题

提问于
浏览
0

我正在研究一个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也提供了平均性能但仍然可用 . ))例如:

**seconds elapsed for 5.5.27 MySQL : 1.48 SEC ** seconds elapsed for 5.7 MySQL : 14.960 SEC
enter image description here

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

注意:我也理解基于第一列的自动排序在5.7上没有工作,这导致我在查询中输入一个订单,这导致更多的延迟 .

UPDATE : EXPLAIN for 5.5.27 version
enter image description here

EXPLAIN for 5.7版
enter image description here

1 回答

  • 0

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

    由于您可能经常使用"sequences",为什么不构建一个数字为1的永久表...(某些大值) . 然后你可以说 FROM numbers ... WHERE n BETWEEN 1 AND 10 (并留下 LIMIT ) .

    如果您使用的是MariaDB,则可以通过伪表 seq_1_to_10 动态生成'table' . 或者,也许更好: seq_22001_to_22010 并避免 22000+ .

相关问题