[英]SQL query with multiple joins impacting performance
我有一個具有近4000條記錄的關系MySQL數據庫。 聯系人表與具有一對多關系的關鍵字和注釋表相關。 我編寫了一個查詢(使用PHP),該查詢將檢索每個聯系人記錄,並為每個聯系人獲取組concat函數中的所有相關注釋和關鍵字。 如果僅抓住聯系人,查詢將相對快速地執行,但是通過兩個左聯接和組連接,查詢將花費近30秒鍾。 有沒有辦法加快速度?
這是我的查詢:
SELECT c.*, GROUP_CONCAT(DISTINCT n.id, '[-]', n.value, '' SEPARATOR '---') as notes,
GROUP_CONCAT(DISTINCT kk.id, '[-]', kk.value) as keywords
FROM contacts c
LEFT JOIN notes n ON c.id LIKE n._contactID
LEFT JOIN
( SELECT k.*, kc._contactID as contactID
FROM keywords k
INNER JOIN keywords_contacts kc ON k.id LIKE kc._keywordID
) kk ON kk.contactID LIKE c.id
GROUP BY c.id
ORDER BY c.`Last Name`, c.`First Name`
在您的查詢中,我可以看到c.id LIKE n._contactID
,這里LIKE的性能降低,因此請使用=運算符並為外鍵字段_contactID
提供索引。
與k.id LIKE kc._keywordID
相同k.id LIKE kc._keywordID
使用=運算符代替LIKE並在字段_keywordID
上應用索引。
是的,使用=
代替LIKE
; 在需要通配符(例如first_name LIKE 'H%'
時保留LIKE
。
更改為=
,您仍然可能發現查詢變慢。 考慮這些:
如果不需要LEFT
,請不要使用它。 通常,從作為子查詢的“表”開始更快(請參閱LEFT JOIN ( SELECT ...)
),但是使用LEFT
往往會抑制這種情況。
如果GROUP BY
和ORDER BY
相同,則可以避免使用臨時表並進行排序:
GROUP BY c.`Last Name`, c.`First Name`, c.id
ORDER BY c.`Last Name`, c.`First Name`, c.id
請提供SHOW CREATE TABLE
和EXPLAIN SELECT ...
,以便我們對索引進行評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.