[英]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之類的表創建了索引,將對您有幫助嗎? 任何提示將不勝感激! 謝謝。
您可能希望將查詢分為兩個而不是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.