簡體   English   中英

提高mysql查詢的性能

[英]Improve performance of mysql query

我有一個mysql sql select,它花了很長時間返回數據。

╔════════════════╗    ╔════════════════╗
║ ITEM           ║    ║ Workspace      ║
╠════════════════║    ╠════════════════║
║ id             ║    ║ id             ║
║ guid           ║    ║ guid           ║
║ workspace_id   ║    ║ company_id     ║
║ deleted        ║    ║ deleted        ║
╚════════════════╝    ╚════════════════╝
Indexes: id, guid     Indexes: id, guid,
 workspace_id          company_id


╔════════════════╗    ╔════════════════════╗
║ COMPANY        ║    ║ item_category_xref ║
╠════════════════║    ╠════════════════════║
║ id             ║    ║ item_id            ║
║ deleted        ║    ║ category_id        ║
╚════════════════╝    ╚════════════════════╝
Indexes: id           Indexes: item_id, category_id

╔════════════════╗    ╔═════════════════════╗
║ item_image     ║    ║ tracking_action     ║
╠════════════════║    ╠═════════════════════║
║ item_id        ║    ║ id                  ║
║ sequence       ║    ║ guid                ║
╚════════════════╝    ║ action              ║
Indexes:              ║ context             ║
 (item_id, sequence)  ║ deleted             ║
                      ╚═════════════════════╝

SQL

    SELECT
        itm.id "item.id",
        ws.id "workspace.id", 
        co.id "company.id", 
       ((SELECT count(*) FROM item_category_xref icx
          WHERE icx.item_id = itm.id
            AND icx.featured = 1) > 0) "featured",
        (SELECT COUNT(*) FROM tracking_action ta1
          WHERE ta1.context = 'ITEM'
            AND ta1.context_guid = itm.guid
            AND ta1.action = 'VIEW') ta_view_count ,
        (SELECT COUNT(*) FROM tracking_action ta2
          WHERE ta2.context = 'ITEM'
            AND ta2.context_guid = itm.guid
            AND ta2.action = 'SEARCH_RESULT') ta_search_count 
     FROM item itm 
     JOIN workspace ws
            ON itm.workspace_id = ws.id
            AND ws.deleted != 1
     JOIN company co
            ON ws.company_id = co.id
            AND co.deleted != 1
     JOIN item_category_xref icx
            ON itm.id = icx.item_id
            AND icx.category_id = 1
     LEFT JOIN item_image ii
            ON itm.id = ii.item_id
            AND ii.sequence = 1 
    WHERE itm.deleted != 1 
   HAVING featured > 0;

說明 SQL解釋

該查詢是我努力減少和改進的結果。 我已經從最初的查詢花費了180秒減少到現在的大約20秒,但仍然不夠。

誰能為此查詢提供性能改進?

我們正在搜索幾百萬行數據,因此每一點都會有所幫助。

子查詢中使用的許多字段都不屬於索引。 如果打算在此類查詢中大量使用它,請嘗試創建與這些子查詢相對應的復合索引。 您可能不需要全部(這取決於表的大小以及其中的數據分布方式)。

另外,您沒有指定trace_action表的外觀,但是我看到您在此處使用文本字段(如果它是文本字段),如果該字段未建立索引,那么它也會減慢查詢速度。

我將嘗試創建以下一些復合索引:

item_category_xref - (item_id, featured) and (item_id, category_id)
tracking_action - (context_guid, context, action)
item_image - (item_id, sequence)

我會將您的子查詢移至整體查詢中的更適當位置。 您想要的結果中的任何內容,都可以將其子查詢加入到item表中。 要比較的對象應該在where字段中。 此外,您在查詢中比較的所有內容都需要建立索引。 顯而易見的一個是delete字段,但是我將包括跟蹤動作context_guidaction字段,可能作為復合索引。 我還要確保在查詢中正確引用action ,因為它是保留字。

這將給您帶來額外的好處,即能夠分解每個子查詢並單獨測試它們以查找性能問題。 這將使您能夠隔離有問題的表或索引。

這是我的粗略觀點,語法可能並不完美。

SELECT
    itm.id "item.id",
    ws.id "workspace.id", 
    co.id "company.id",
    tav.ta_view_count,
    tas.ta_search_count
FROM item itm
    LEFT JOIN (SELECT ta1.context_guid, COUNT(*) as ta_view_count FROM tracking_action ta1 GROUP BY ta1.context_guid HAVING ta1.context_guid = 'ITEM' AND ta1.`action` = 'VIEW') tav ON tav.context_guid = itm.guid
    LEFT JOIN (SELECT ta2.context_guid, COUNT(*) as ta_search_count FROM tracking_action ta2 GROUP BY ta2.context_guid HAVING ta2.context_guid = 'ITEM' AND ta2.`action` = 'SEARCH_RESULT') tas ON tas.context_guid = itm.guid
WHERE   itm.deleted != 1 AND
        itm.id IN (SELECT icx.item_id, COUNT(*) featured FROM item_category_xref icx GROUP BY icx.item_id HAVING featured > 0) AND
        itm.id IN (SELECT company.id FROM company WHERE company.deleted != 1) AND
        itm.id IN (SELECT workspace.id FROM workspace WHERE workspace.deleted != 1) AND
        itm.id IN (SELECT item_image.id FROM item_image WHERE item_image.sequence != 1);

暫無
暫無

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

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