簡體   English   中英

加入一個外鍵時如何避免全表掃描

[英]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.

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