[英]how to avoid full table scan when joining on one foreign key
如何在加入下面的一個外鍵時避免全表掃描是我的 sql 查詢,當我使用解釋 select 它顯示查詢正在掃描所有表,即使使用 where 子句
SELECT message_recipients.id, message_recipients.user_type,
COALESCE(guardians.firstname, students.firstname)
FROM message_recipients
LEFT JOIN students ON message_recipients.user_id = students.student_id
LEFT JOIN guardians ON message_recipients.user_id = guardians.guardian_id
WHERE message_recipients.message_id = 2
此外,我在 message_id 列上添加了索引仍然相同,下面是解釋 select 的圖像可能是我讀錯了
表中的總行數為 8,但message_id = 2
僅為 6 行,如果您檢查圖像,您可以看到它掃描了所有 8 行,這不是大問題是我如何優化它以避免完整表格掃描謝謝
避免完全掃描的一種方法是使用帶有“with”子句的集群查詢,如下所示:
WITH TB_A AS (
SELEC
A.*
FROM
some_table A
WHERE
A.field_1 = 'some condition to filter first table'
)
, TB_B AS (
SELECT
B.*
FROM
other_table B
WHERE
B.field_2 = 'some condition to filter second table if you need that too'
)
SELECT
A.*
, B.*
FROM
TB_A A
INNER JOIN
TB_B B
ON A.field_1 = B.field_1 --Running without full scan on join and much faster
;
;D
FOREIGN KEY
創建一個INDEX
,但該INDEX
可能不是最佳的。 看看這些“復合”索引是否更好:
message_recipients: INDEX(message_id, user_id, id, user_type)
guardians: INDEX(guardian_id, firstname)
students: INDEX(student_id, firstname)
添加復合索引時,刪除具有相同前導列的索引。 也就是說,當你同時擁有 INDEX(a) 和 INDEX(a,b) 時,扔掉前者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.