Mysql

多次左加入同一張表

  • October 14, 2021

假設我有下表:

id | name  | created_by  | updated_by | deleted_by
--------------------------------------------------
1  | alice | NULL        | NULL       | NULL       
2  | ben   | NULL        | 3          | 1          
3  | kane  | 2           | NULL       | 3          
4  | ali   | 1           | 1          | NULL       
5  | peter | 1           | 1          | 3          
6  | rose  | 1           | 1          | 5          
.
.

**方法1:**我會執行這樣的查詢:

SELECT 
u.*, a.name as 'creator', b.name as 'updator', c.name as 'deletor'
FROM users u
LEFT JOIN users a on u.created_by = a.id
LEFT JOIN users b on u.updated_by = b.id
LEFT JOIN users c on u.deleted_by = c.id
ORDER BY u.id
LIMIT 10

如果表有 1000-10000 條記錄,primary id,查詢是壞還是好?

**方法 2:**或者在沒有左連接的情況下獲取更好,然後在應用程序級別,我執行另一個查詢來獲取創建者/更新者/刪除者,如下所示:

查詢一:

SELECT 
u.*
FROM users u
ORDER BY u.id
LIMIT 10

查詢 2:

SELECT 
u.name
FROM users u
WHERE `id` IN ($ids) # $ids is an array of all created_by+updated_by+deleted_by from query 1
ORDER BY u.id
LIMIT 10

為了確保最大性能(假設id是主要的/唯一的),我建議將 LIMITation 移動到子查詢中:

SELECT 
u.*, a.name as 'creator', b.name as 'updator', c.name as 'deletor'
FROM (SELECT * FROM users ORDER BY id LIMIT 10) u
LEFT JOIN users a on u.created_by = a.id
LEFT JOIN users b on u.updated_by = b.id
LEFT JOIN users c on u.deleted_by = c.id
ORDER BY u.id

10 條記錄的文件排序不會影響性能。

方法 1 在您的場景中會更好,因為它將通過一次查詢執行給出結果,並且似乎根據業務要求正確連接,儘管同一個表被多次連接。id 列上的索引會執行得更好。

使用 order by 的方法 2 將需要臨時 db 中的更多空間進行處理,如果 #ids 中有很多返回值(例如有大量更新、刪除或創建的值),IN 運算符將降低查詢 2 中的性能查詢 1) 返回的使用者。

引用自:https://dba.stackexchange.com/questions/207038