PolarDB mendukung konversi predikat IN menjadi join. Untuk query kompleks, pengoptimal mengonversi beberapa predikat IN besar menjadi join.
Prasyarat
Kluster PolarDB for MySQL 8.0 dengan versi revisi 8.0.2.2.10 atau lebih baru. Untuk informasi tentang cara memeriksa versi kluster, lihat Versi mesin 5.6, 5.7, dan 8.0.
Jumlah elemen dalam daftar IN mencapai angka yang ditentukan dalam parameter loose_in_predicate_conversion_threshold.
Kondisi
[NOT]INberada di tingkat teratas klausaWHEREatauON.
Penggunaan
Gunakan parameter loose_in_predicate_conversion_threshold untuk menentukan apakah fitur ini diaktifkan. Untuk informasi lebih lanjut, lihat Tentukan parameter kluster dan node.
Parameter | Tingkat | Deskripsi |
loose_in_predicate_conversion_threshold | Global | Menentukan apakah akan mengaktifkan fitur ini. Jika jumlah elemen dalam daftar IN dari pernyataan SQL mencapai angka yang ditentukan dalam parameter ini, predikat IN dalam pernyataan SQL dikonversi menjadi join. Nilai valid: 0 hingga 18446744073709551615. Nilai default: 5000. Catatan Jika parameter ini disetel ke 0, fitur ini dinonaktifkan. |
Contoh
Query asli:
mysql> EXPLAIN SELECT * FROM t WHERE a IN (1,2,3,5,5);
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | t | NULL | ALL | NULL | NULL | NULL | NULL | 160 | 50.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
mysql> EXPLAIN format=tree SELECT * FROM t WHERE a IN (1,2,3,5,5);
+------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------+
| -> Filter: (t.a IN (1,2,3,5,5)) (cost=16.25 rows=80)
-> TABLE scan ON t (cost=16.25 rows=160)
|
+------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)Query yang dikonversi:
mysql> SET in_predicate_conversion_threshold=5;
mysql> EXPLAIN SELECT * FROM t WHERE a IN (1,2,3,5,5);
+----+-------------+------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+--------------------------+
| 1 | PRIMARY | t | NULL | ALL | NULL | NULL | NULL | NULL | 160 | 100.00 | Using where |
| 1 | PRIMARY | <derived3> | NULL | eq_ref | <auto_distinct_key> | <auto_distinct_key> | 8 | test.t.a | 1 | 100.00 | Using where; Using index |
| 3 | DERIVED | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | IN-list Converted |
+----+-------------+------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+--------------------------+
mysql> EXPLAIN format=tree SELECT * FROM t1 WHERE a IN (1,2,3,5,5);
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Nested loop semijoin
-> Filter: (t1.a IS NOT NULL) (cost=0.55 rows=3)
-> TABLE scan ON t1 (cost=0.55 rows=3)
-> Filter: (t1.a = tvc_0._col_1)
-> Index lookup ON tvc_0 using <auto_key0> (_col_1=t1.a)
-> Materialize
-> scan ON in-list: 5 rows