Penurunan predikat penuh menghilangkan penyaringan baris berlebih yang dilakukan MySQL pada lapisan SQL setelah pemindaian indeks berbasis rentang, sehingga mengurangi beban komputasi untuk kueri rentang besar pada PolarDB for MySQL.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster PolarDB for MySQL yang menjalankan versi 8.0
Versi revisi 8.0.1.1.5 atau lebih baru, atau 8.0.2.2.0 atau lebih baru
Untuk informasi tentang cara memeriksa versi kluster Anda, lihat Kueri versi mesin.
Cara kerja
Pada MySQL Community Edition, ketika suatu kueri menggunakan kondisi rentang untuk memindai indeks, kondisi tersebut dievaluasi dua kali:
Tanpa penurunan predikat penuh:
Mesin penyimpanan memindai indeks menggunakan kondisi rentang dan mengembalikan baris yang cocok.
Lapisan SQL menyaring ulang baris yang dikembalikan menggunakan kondisi rentang yang sama.
Dengan penurunan predikat penuh:
Mesin penyimpanan memindai indeks menggunakan kondisi rentang dan mengembalikan baris yang cocok.
Kondisi rentang dibuang. Lapisan SQL melewatkan penyaringan ulang karena mesin penyimpanan telah menerapkannya.
Penyaringan ganda ini memboroskan sumber daya komputasi. Penurunan predikat penuh menghapus proses penyaringan berlebih di lapisan SQL tersebut.
Aktifkan penurunan predikat penuh
Gunakan variabel detach_range_condition dari parameter loose_optimizer_switch untuk mengaktifkan atau menonaktifkan penurunan predikat penuh. Untuk informasi selengkapnya, lihat Tentukan parameter kluster dan node.
Verifikasi dengan EXPLAIN
Gunakan bidang Extra dalam output EXPLAIN untuk memastikan apakah penurunan predikat penuh aktif:
Extra nilai | Makna |
|---|---|
Using where | Lapisan SQL sedang menyaring ulang baris. Penurunan predikat penuh dinonaktifkan. |
Using index | Lapisan SQL melewatkan penyaringan ulang. Penurunan predikat penuh aktif. |
Dinonaktifkan (garis dasar)
Contoh berikut menggunakan skema TPC-H. Dengan detach_range_condition diatur ke off, output EXPLAIN menampilkan Using where, yang menunjukkan bahwa kondisi rentang diterapkan kembali di lapisan SQL (TPC-H Q2).
set @@optimizer_switch='detach_range_condition=off';
EXPLAIN SELECT * FROM lineitem WHERE l_orderkey > 10 AND l_orderkey < 60000000 LIMIT 10000000, 10\G*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: lineitem
partitions: NULL
type: range
possible_keys: PRIMARY,i_l_orderkey,i_l_orderkey_quantity
key: PRIMARY
key_len: 4
ref: NULL
rows: 29720232
filtered: 100.00
Extra: Using whereDiaktifkan
Dengan ignore_polar_optimizer_rule diatur ke on, kondisi rentang dibuang setelah pemindaian oleh mesin penyimpanan. Output EXPLAIN menampilkan Using index, yang menunjukkan bahwa lapisan SQL melewatkan penyaringan ulang. Contoh berikut menggunakan TPC-H Q5 dan Q6.
Q5
set @@ignore_polar_optimizer_rule=on;
EXPLAIN SELECT COUNT(*) FROM lineitem WHERE l_suppkey > 10 AND l_suppkey < 50000\G*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: lineitem
partitions: NULL
type: range
possible_keys: i_l_suppkey_partkey,i_l_suppkey
key: i_l_suppkey
key_len: 5
ref: NULL
rows: 29720232
filtered: 100.00
Extra: Using indexQ6
set @@ignore_polar_optimizer_rule=on;
EXPLAIN SELECT COUNT(*) FROM LINEITEM WHERE l_receiptDATE > '1992-01-03' AND l_receiptDATE < '1994-12-31'\G*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: LINEITEM
partitions: NULL
type: range
possible_keys: i_l_receiptdate
key: i_l_receiptdate
key_len: 4
ref: NULL
rows: 29720232
filtered: 100.00
Extra: Using indexHasil pengujian
Gambar berikut menunjukkan perbedaan performa antara mengaktifkan dan menonaktifkan penurunan predikat penuh, diukur menggunakan kueri TPC-H Q5 dan Q6 dengan faktor skala 10.
