2017-09-15 109 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更新了問題。 –