PolarDB支援LEFT JOIN(左串連)消除功能。對於滿足前提條件的複雜查詢,通過該功能可以對SQL查詢進行變換,即去掉不必要的LEFT JOIN
子查詢,從而提升SQL查詢的效能。
前提條件
叢集版本需為PolarDB MySQL版8.0版本且修訂版本需滿足如下條件:
8.0.1.1.32或以上。
8.0.2.2.10或以上。
使用限制
使用LEFT JOIN(左串連)消除功能,需要同時滿足以下條件:
對於左表中的任意一行資料,右表中能匹配JOIN條件的行數有且僅有一行。
除
LEFT JOIN
子查詢以外,當前SQL語句中的其他地方沒有引用右表的資料。
背景資訊
LEFT JOIN(左串連)在複雜分析查詢中被廣泛使用,是所有SQL查詢中最常見和最耗時的運算元。一個串連操作,需要將左右兩邊的關係(表)根據串連條件中指定的串連列,拼接到一起與主查詢進行關聯,極大的提升了查詢的複雜度。如果可以消除掉不必要的串連操作,將對查詢的效能有很大的提升。
使用方法
您可以通過loose_join_elimination_mode參數開啟LEFT JOIN(左串連)消除功能。具體操作請參見設定叢集參數和節點參數。
參數名稱 | 層級 | 描述 |
loose_join_elimination_mode | Global | LEFT JOIN(左串連)消除功能控制開關。取值範圍:
|
樣本
原查詢:
原始查詢基於table1
、table2
和table3
的LEFT JOIN
得到最終的記錄條數,該查詢的執行時間為7.5秒。
EXPLAIN
SELECT count(*)
FROM `table1` `sc`
LEFT JOIN `table2` `ca` ON `sc`.`car_id` = `ca`.`id`
LEFT JOIN `table3` `co` ON `sc`.`company_id` = `co`.`id`;
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+
| 1 | SIMPLE | sc | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL |
| 1 | SIMPLE | ca | NULL | eq_ref | PRIMARY | PRIMARY | 4 | je_test.sc.car_id | 1 | 100.00 | Using index |
| 1 | SIMPLE | co | NULL | eq_ref | PRIMARY | PRIMARY | 4 | je_test.sc.company_id | 1 | 100.00 | Using index |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+
上述查詢中,table1
對於table2
和table3
的串連條件中都使用了表的主鍵,保證了輸出的唯一性。且在投影列中沒有引用table2
和table3
的任何錶列,因此LEFT JOIN
可以被安全的消除。
變換後的查詢:
EXPLAIN
SELECT count(*)
FROM `table1` `sc`
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | sc | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
通過上述查詢可以看到,在消除table2
和table3
後,只需要查詢table1
的記錄。可以極大的節省計算資源,提升執行效率。該查詢的執行時間是0.1秒,相比原查詢提升了75倍。