在下面的查詢中,我顯示銷售的最新狀態(按階段,在這種情況下爲數字3)。查詢是基於在售的狀態歷史記錄的子查詢:優化Mysql:獲取銷售的最新狀態
SELECT v.id_sale,
IFNULL((
SELECT (CASE WHEN IFNULL(vec.description, '') = ''
THEN ve.name
ELSE vec.description
END)
FROM t_record veh
INNER JOIN t_state_campaign vec ON vec.id_state_campaign = veh.id_state_campaign
INNER JOIN t_state ve ON ve.id_state = vec.id_state
WHERE veh.id_sale = v.id_sale
AND vec.id_stage = 3
ORDER BY veh.id_record DESC
LIMIT 1
), 'x') sale_state_3
FROM t_sale v
INNER JOIN t_quarters sd ON v.id_quarters = sd.id_quarters
WHERE 1 =1
AND v.flag =1
AND v.id_quarters =4
AND EXISTS (
SELECT '1'
FROM t_record
WHERE id_sale = v.id_sale
LIMIT 1
)
查詢延遲0.0057seg並顯示1011記錄。
因爲我必須按照狀態名稱過濾銷售情況,因爲它必須在where子句中重複子查詢,所以我決定使用連接更改相同的查詢。在這種情況下,我使用MAX函數獲取最新狀態:
SELECT
v.id_sale,
IFNULL(veh3.State3,'x') AS sale_state_3
FROM t_sale v
INNER JOIN t_quarters sd ON v.id_quarters = sd.id_quarters
LEFT JOIN (
SELECT veh.id_sale,
(CASE WHEN IFNULL(vec.description,'') = ''
THEN ve.name
ELSE vec.description END) AS State3
FROM t_record veh
INNER JOIN (
SELECT id_sale, MAX(id_record) AS max_rating
FROM(
SELECT veh.id_sale, id_record
FROM t_record veh
INNER JOIN t_state_campaign vec ON vec.id_state_campaign = veh.id_state_campaign AND vec.id_stage = 3
) m
GROUP BY id_sale
) x ON x.max_rating = veh.id_record
INNER JOIN t_state_campaign vec ON vec.id_state_campaign = veh.id_state_campaign
INNER JOIN t_state ve ON ve.id_state = vec.id_state
) veh3 ON veh3.id_sale = v.id_sale
WHERE v.flag = 1
AND v.id_quarters = 4
此查詢顯示相同的結果(1011)。但問題是它需要0.0753秒
審查的可能性我發現,使得查詢的速度差異的因素:
AND EXISTS (
SELECT '1'
FROM t_record
WHERE id_sale = v.id_sale
LIMIT 1
)
如果我刪除此條款,兩個詢問相同時間延遲...爲什麼它更好?有什麼方法可以在連接中使用這個子句?我希望你的幫助。
編輯
我會告訴解釋每個分別查詢的結果:
Q1:
Q2:
感謝您的回覆。對於我來說,這是一個重要的時刻,原因很簡單,我所顯示的查詢只是銷售狀態。他真正的查詢顯示每個階段的不同狀態(每個子查詢/聯接),如果我們添加時間,則有一段時間查詢可能需要1.5秒。對0.3xxx秒。所以知道是否有任何方法來優化連接會很有趣。索引表例如在Table t_record中:i_id_record,i_id_state_campaign,i_id_sale ... – csotelo