一、左連接實現原理
我們先來了解一下左連接的實現原理。左連接(Lef Join),指返回左表中所有的記錄以及右表中連接欄位相等的記錄,右表中沒有與之連接的記錄返回NULL值。其實現的方式是,先對左表進行全表掃描,將每一行數據與右表的進行匹配,對於匹配上的行進行結果集合併,對於未匹配上的行,使用NULL值進行佔位。
二、left join的性能瓶頸
雖然left join是一種非常常用的數據操作方式,但是它也有其性能瓶頸。對於具有巨大數據量的表,left join查詢的性能明顯下降。主要原因在於left join查詢需要掃描兩個相對龐大的表,並且需要在內存中對兩個結果集進行合併,計算量非常大。而left join的性能瓶頸主要來源於以下兩個因素:
1、數據量過大,導致查詢速度變慢。比如說,假設我們需要查詢一個銷售訂單的詳細信息,需要使用left join鏈接訂單明細表和產品表,如果這兩個表都有上千萬條記錄,那麼查詢的速度將會非常緩慢。
2、索引統計信息不全,在查詢過程中無法使用到最佳的執行計劃。left join查詢的優劣與使用的執行計劃的質量有很大關係,如果MySQL無法獲取到合適的統計信息,就會使用不最優的執行計劃,導致性能下降。
三、優化left join
1、合理使用索引
在進行left join查詢的時候,一定要確保連接欄位使用上了索引,否則查詢速度將會非常慢。
SELECT a.id, b.name FROM table1 a LEFT JOIN table2 b ON a.id = b.id WHERE b.name LIKE '%test%'
上述代碼中,如果我們沒有為id欄位建立索引,那麼查詢的速度將會非常慢。建立索引的代碼如下:
ALTER TABLE table1 ADD INDEX idx_id(id); ALTER TABLE table2 ADD INDEX idx_id(id);
2、使用子查詢
大部分情況下使用left join是為了獲取主表中所有的記錄,以及與之相關的關聯表記錄。但是,如果我們只需要滿足某些條件下的記錄,可以考慮使用子查詢,這樣可以減少left join的掃描範圍,提高查詢效率。
SELECT a.id, a.title, a.create_time FROM table1 a WHERE a.id IN ( SELECT b.id FROM table2 b WHERE b.name LIKE '%test%' );
3、限制查詢結果
如果left join查詢的結果集非常龐大,需要返回很多無用的數據,消耗大量的資源和時間,可以考慮限制查詢結果範圍,減少查詢耗時。
SELECT a.id, b.name FROM table1 a LEFT JOIN table2 b ON a.id = b.id WHERE a.id <= 1000 and b.name LIKE '%test%';
4、分頁查詢優化
對於需要使用分頁查詢的場景,如果left join的結果集非常龐大,需要使用很多的計算和排序操作,那麼查詢的性能瓶頸將會更加明顯。這個時候我們可以考慮使用延遲關聯或者子查詢進行優化。
5、合理使用INNER JOIN
在使用left join的時候,如果我們明確知道被連接的表中包含所有符合條件的記錄,而不是只是部分的記錄,那麼可以使用INNER JOIN代替left join,這樣可以減少查詢的範圍,提高查詢效率。
SELECT a.id, a.title, a.create_time, b.name FROM table1 a INNER JOIN table2 b ON a.id = b.id WHERE b.name LIKE '%test%';
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183370.html