EXPLAIN SELECT
mileage,
departurecode,
destinationcode,
departurelescode,
departurelesname,
destinationlescode,
destination_name,
center_code,
rrs_create_date,
rrs_create_by,
id,
operate,
STATUS
FROM
(
SELECT
a1.mileage,
a1.departurecode,
a1.destinationcode,
a1.departurelescode,
a1.departurelesname,
a1.destinationlescode,
a1.destination_name,
a1.center_code,
a1.rrs_create_date,
a1.rrs_create_by,
a1.std_id AS id,
md.operate,
f.`status`
FROM
md_lczsjm_record a1
LEFT JOIN maintain_detail md ON md.pre_merge_id = a1.id
LEFT JOIN maintain m ON m.id = md.parent_id
LEFT JOIN flows f ON flow_id = f.id
WHERE
order_no > 0
AND f.id IS NULL
UNION
SELECT
a1.mileage,
a1.departurecode,
a1.destinationcode,
a1.departurelescode,
a1.departurelesname,
a1.destinationlescode,
a1.destination_name,
a1.center_code,
a1.rrs_create_date,
a1.rrs_create_by,
a1.std_id AS id,
md.operate,
f.`status`
FROM
md_lczsjm_record a1
LEFT JOIN maintain_detail md ON md.pre_merge_id = a1.id
LEFT JOIN maintain m ON m.id = md.parent_id
LEFT JOIN flows f ON flow_id = f.id
WHERE
order_no > 0
AND f.`status` = 'working'
UNION
SELECT
a1.mileage,
a1.departurecode,
a1.destinationcode,
a1.departurelescode,
a1.departurelesname,
a1.destinationlescode,
a1.destination_name,
a1.center_code,
a1.rrs_create_date,
a1.rrs_create_by,
a1.id,
'',
''
FROM
md_lczsjm a1
LEFT JOIN (
SELECT DISTINCT
std_id
FROM
md_lczsjm_record mt
LEFT JOIN maintain_detail md ON md.pre_merge_id = mt.id
LEFT JOIN maintain m ON m.id = md.parent_id
LEFT JOIN flows f ON flow_id = f.id
WHERE
order_no > 0
AND f.id IS NULL
UNION
SELECT DISTINCT
std_id
FROM
md_lczsjm_record mt
LEFT JOIN maintain_detail md ON md.pre_merge_id = mt.id
LEFT JOIN maintain m ON m.id = md.parent_id
LEFT JOIN flows f ON flow_id = f.id
WHERE
order_no > 0
AND f.`status` = 'working'
) a ON a.std_id = a1.id
WHERE
a.std_id IS NULL
) a
WHERE
1 = 1
AND 1 = 1
LIMIT 0,
10
執行計劃如下:

說明: 主要問題是 md_lczsjm_record 資料過多 大概400W條 陳述句為 三個陳述句查詢出來后 union 之后再limit 每個單獨的查limit都很快 ,考慮是 union 是全表查出來之后再limit,現在時間為40s 希望提高一下查詢速度
uj5u.com熱心網友回復:
可以說一下你的業務邏輯嗎。看這個sql覺得邏輯怪怪的。md_lczsjm_record 表應該可以不用拿那么多次,可以用or、exists來代替uj5u.com熱心網友回復:
record是記錄表 記錄了 主表的操作記錄, 然后 這個是把主表類似回退 成修改之前的資料狀態 ,union的三部分 是uj5u.com熱心網友回復:
分頁導致的,你用視圖試試。或者建一個臨時表uj5u.com熱心網友回復:
挺懷疑是否真的需要這么長的sql其實很多時候,是資料庫設計人員沒有設計好,導致開發人員寫的sql難以優化。
有些資料庫設計人員一味為了追求范式,結果導致開發人員sql都不知道該怎么寫。
個人覺得資料庫設計要盡可能簡單,這樣性能優化才好做。表結構簡單,查詢陳述句也簡單,性能不行,加個索引基本就都解決了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/7107.html
標籤:MySQL
上一篇:MYSQL 表值函式
