我正在查询检索服务报告列表及其详细信息。该查询还通过在详细信息列中添加' - '来返回数据库中缺少的服务报告。花一些时间在它之后,我已经想出了这样的查询: -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
查询实际上很多行生成一个表,并使用服务表中的数据进行比较。如果服务号码不是连续的,它会在其他列中生成' - '缺失的报告号码,并且完成理想的结果,就是这样。
但问题是,执行查询时速度很慢,当我比较5.5.27当MySQL版本升级到5.7(5.5.27也给出了平均业绩,但仍然可用。)) 为例如:经过对5.5.27的MySQL
秒:1.48 SEC **经过5.7的MySQL **秒:14.960 SEC
请告知如何提高MySQL 5.7或SQL中的查询性能。
注意:我也明白,基于第一列的自动排序不适用于5.7,这导致我在查询中放置了一个排序,这会导致更多延迟。
a)请添加解释输出(写入'解释'infront你的选择,并发布两个数据库的结果)b)你的意思是说明。查询中没有'order by'。如果没有适当的索引,额外的'order by'可以减慢查询速度。没有命令:取前10行(可能是你想要的,或者不是,所以5.5可能很快,但只是偶然的“正确”)。按顺序排列:order * everything * first,然后使用前10行。 c)添加索引或表格描述以及一些示例数据。 d)我不确定我是否理解行号的原因。 – Solarflare
什么是“虚拟表”?它有多少行?你真的需要'加入'它吗? –
没有'ORDER BY'的'LIMIT'没有意义。 –