全部產品
Search
文件中心

PolarDB:LEFT JOIN(左串連)消除

更新時間:Jul 06, 2024

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(左串連)消除功能控制開關。取值範圍:

  • REPLICA_ON(預設值):僅在唯讀節點開啟LEFT JOIN(左串連)消除功能。

  • ON:開啟LEFT JOIN(左串連)消除功能。

  • OFF:關閉LEFT JOIN(左串連)消除功能。

樣本

原查詢

原始查詢基於table1table2table3LEFT 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對於table2table3的串連條件中都使用了表的主鍵,保證了輸出的唯一性。且在投影列中沒有引用table2table3的任何錶列,因此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  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

通過上述查詢可以看到,在消除table2table3後,只需要查詢table1的記錄。可以極大的節省計算資源,提升執行效率。該查詢的執行時間是0.1秒,相比原查詢提升了75倍。