簡體   English   中英

長SQL查詢優化

[英]Long Sql Query optimization

我有一個SQL查詢,當有很多人登錄到該站點時,它會關閉我的整個服務器。

我花了一整天的時間試圖找到如何使用索引教程來解決它,但我仍然不明白如何解決此查詢,或者我是否可以解決所有問題

這是查詢:

SELECT t.id, 
       t.title, 
       t.s_secret, 
       t.content, 
       t.senton, 
       t.hidden, 
       t.reported, 
       t.root_id, 
       t.sender_id, 
       t.s_contact_name, 
       t.s_contact_email, 
       t.item_id, 
       t.status_id, 
       t.event_id, 
       l.id              AS last_id, 
       l.title           AS last_title, 
       l.s_secret        AS last_s_secret, 
       l.content         AS last_content, 
       l.senton          AS last_sentOn, 
       l.hidden          AS last_hidden, 
       l.reported        AS last_reported, 
       l.root_id         AS last_root_id, 
       l.sender_id       AS last_sender_id, 
       l.s_contact_name  AS last_s_contact_name, 
       l.s_contact_email AS last_s_contact_email, 
       l.item_id         AS last_item_id, 
       l.status_id       AS last_status_id, 
       l.event_id        AS last_event_id, 
       last.count        AS t_count 
FROM   oc_t_mmessenger_recipients r 
       JOIN oc_t_mmessenger_message l 
         ON l.id = r.message_id 
       JOIN (SELECT Max(im.id) AS max, 
                    Count(1)   AS count 
             FROM   oc_t_mmessenger_message im 
             GROUP  BY root_id) last 
         ON r.message_id = last.max 
       JOIN oc_t_mmessenger_message t 
         ON t.id = l.root_id 
       JOIN oc_t_mmessenger_message_labels ml 
         ON ( ml.fk_i_message_id = t.id 
              AND ml.fk_i_label_id = 1 
              AND ml.fk_i_user_id = 2569 ) 
WHERE  ( r.recipient_id = 2469 
          OR l.sender_id = 2469 ) 
ORDER  BY last.max DESC 
LIMIT  0, 10 

如果我通過phpmyadmin為諸如receive_id和sender_id之類的表創建了索引,將對您有幫助嗎? 任何提示將不勝感激! 謝謝。

編輯: 這是EXPLAIN輸出

這是當前表的索引: 索引

您可能希望將查詢分為兩個而不是OR語句。 喜歡:

(SELECT 
# everything from your query
WHERE r.recipient_id = 2469)
UNION
(SELECT
# everything from your query, again
WHERE l.sender_id = 2469)

這樣,您應該能夠同時使用receive_id和sender_id索引。

但是正如其他人所說,最大的問題可能是內部選擇。

好的,您有幾個我在考慮的索引,因此您離您並不遙遠。 現在,內部選擇正在破壞性能。

以下索引應加快內部選擇的速度:

create index ix1_message on oc_t_mmessenger_message (root_id, id);

暫無
暫無

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

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