簡體   English   中英

具有多個聯接的SQL查詢會影響性能

[英]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 BYORDER BY相同,則可以避免使用臨時表並進行排序:

GROUP BY c.`Last Name`, c.`First Name`, c.id
ORDER BY c.`Last Name`, c.`First Name`, c.id

請提供SHOW CREATE TABLEEXPLAIN SELECT ... ,以便我們對索引進行評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM