PolarDB mendukung pengubahan predikat IN menjadi JOIN. Untuk kueri kompleks yang memenuhi prasyarat, pengoptimal mengonversi predikat IN berukuran besar menjadi JOIN guna meningkatkan performa kueri.
Prasyarat
Kluster harus menjalankan PolarDB for MySQL 8.0, versi revisi 8.0.2.2.10 atau yang lebih baru. Untuk informasi selengkapnya, lihat Menanyakan nomor versi.
Jumlah elemen dalam daftar IN melebihi nilai parameter loose_in_predicate_conversion_threshold.
Kondisi
[NOT] INberada di lapisan teratas klausaWHEREatauON.
Penggunaan
Anda dapat menggunakan parameter loose_in_predicate_conversion_threshold untuk mengonfigurasi fitur yang mengubah predikat IN menjadi JOIN. Untuk informasi selengkapnya, lihat Mengatur parameter kluster dan node.
Nama Parameter | Tingkat | Deskripsi |
loose_in_predicate_conversion_threshold | Global | Mengontrol fitur yang mengubah predikat IN menjadi JOIN. Jika jumlah elemen dalam daftar IN suatu pernyataan SQL lebih besar dari atau sama dengan nilai parameter ini, pengoptimal akan mengubah predikat IN menjadi JOIN. Nilai yang valid: 0 hingga 18446744073709551615. Nilai default: 5000. Catatan Jika Anda mengatur parameter ini ke 0, fitur ini dinonaktifkan. |
Contoh
Kueri 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)Kueri yang diubah:
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