簡體   English   中英

WHERE子句中的多個JOIN和OR MySQL查詢優化

[英]Multiple JOIN and OR in WHERE clause MySQL query optimization

我正在嘗試優化與此類似的查詢:

SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.t2_id = t2.id
LEFT OUTER JOIN table3 t3 ON t1.t3_id = t3.id
LEFT OUTER JOIN table4 t4 ON t3.t4_id = t4.id
LEFT OUTER JOIN table5 t5 ON t3.t5_id = t5.id
LEFT OUTER JOIN table6 t6 ON t1.t6_id = t6.id
WHERE (t1.attribute1 = ? OR t2.attribute2 = ?)
AND t1.active = 1
AND t1.status <> 10

我在日志中看到的是,WHERE 子句中最需要的是 OR(使用 OR,查詢需要大約 1 秒的時間來執行,而沒有它,我從D B)。

我正在尋找替代方法來獲得相同的結果而無需花費太多時間(此外,如果同時執行許多查詢,性能也會降低)。

我嘗試用 t1 和 t2 之間的連接將 OR 替換為聯合子查詢(我正在使用 MySQL 5.7):

SELECT * FROM (SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.t2_id = t2.id
WHERE t1.attribute1 = ?
UNION
SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.t2_id = t2.id
WHERE t2.attribute2 = ?
) AS joined
LEFT OUTER JOIN table3 t3 ON joined.t3_id = t3.id
LEFT OUTER JOIN table4 t4 ON t3.t4_id = t4.id
LEFT OUTER JOIN table5 t5 ON t3.t5_id = t5.id
LEFT OUTER JOIN table6 t6 ON joined.t6_id = t6.id
WHERE joined.active = 1
AND joined.status <> 10

但我想知道是否有更好的方法來優化查詢。

編輯:活動、狀態、屬性 1 和屬性 2 以及 id 都被編入索引。

只要您沒有選擇太多行(理想情況下少於 1000 行),以下索引可以提高第一個查詢的性能:

create index ix1 on table1 (attribute1, active, status, t2_id);

添加此索引。 如果它仍然很慢,請將執行計划添加到您的問題中。

暫無
暫無

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

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