Mysql
多次左加入同一張表
假設我有下表:
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) 返回的使用者。