我正在查詢檢索服務報告列表及其詳細信息。該查詢還通過在詳細信息列中添加' - '來返回數據庫中缺少的服務報告。花一些時間在它之後,我已經想出了這樣的查詢: -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'沒有意義。 –