2017-09-15 115 views
0

我正在查询检索服务报告列表及其详细信息。该查询还通过在详细信息列中添加' - '来返回数据库中缺少的服务报告。花一些时间在它之后,我已经想出了这样的查询: -MySQL - 性能问题在升级5.5.27至5.7

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

但问题是,执行查询时速度很慢,当我比较5.5.27当MySQL版本升级到5.7(5.5.27也给出了平均业绩,但仍然可用。)) 为例如:经过对5.5.27的MySQL

秒:1.48 SEC **经过5.7的MySQL enter image description here **秒:14.960 SEC enter image description here

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

注意:我也明白,基于第一列的自动排序不适用于5.7,这导致我在查询中放置了一个排序,这会导致更多延迟。

UPDATE: 解释5.5.27版本 enter image description here

解释5.7版本 enter image description here

+0

a)请添加解释输出(写入'解释'infront你的选择,并发布两个数据库的结果)b)你的意思是说明。查询中没有'order by'。如果没有适当的索引,额外的'order by'可以减慢查询速度。没有命令:取前10行(可能是你想要的,或者不是,所以5.5可能很快,但只是偶然的“正确”)。按顺序排列:order * everything * first,然后使用前10行。 c)添加索引或表格描述以及一些示例数据。 d)我不确定我是否理解行号的原因。 – Solarflare

+0

什么是“虚拟表”?它有多少行?你真的需要'加入'它吗? –

+0

没有'ORDER BY'的'LIMIT'没有意义。 –

回答

0

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

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

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

+0

用EXPLAIN更新了问题。 –