全部产品
Search
文档中心

PolarDB:Atur algoritma penyaringan kueri indeks penyimpanan kolom

更新时间:Dec 14, 2025

Selama eksekusi kueri, fitur pruner pada indeks penyimpanan kolom menyaring blok data yang tidak perlu diakses, sehingga meningkatkan performa kueri SQL. Topik ini menjelaskan skenario penggunaan pruner, pertimbangan, sintaksis, dan parameter terkait.

Ikhtisar

Data indeks penyimpanan kolom disimpan dalam blok data berkolom tunggal dengan granularitas default 64.000 baris per blok. Jumlah blok data dapat diperkirakan menggunakan rumus: total baris tabel / 64000. Semua paket kolom untuk satu set baris membentuk grup baris. Pemindaian data memerlukan penelusuran semua blok data kolom tertentu untuk mengambil catatan yang memenuhi kondisi filter. Overhead pemindaian tinggi saat melakukan kueri pada tabel besar, terutama jika data tabel tidak muat sepenuhnya dalam memori. Dalam praktiknya, informasi statistik bersama kondisi filter tertentu dapat digunakan untuk melewati blok data yang tidak diperlukan dan mempercepat kueri. Dalam indeks penyimpanan kolom PolarDB, metode ini disebut pruner. Saat ini, empat jenis pruner didukung:

  • Bloom filter

    • Menggunakan larik bit untuk merepresentasikan himpunan dan menentukan apakah suatu elemen termasuk dalam himpunan tersebut.

    • Prefix bloom filter: Membangun bloom filter berdasarkan awalan string untuk mengurangi overhead performa dan penyimpanan akibat string panjang. Versi yang didukung adalah sebagai berikut:

      • MySQL 8.0.1, versi revisi 8.0.1.1.42 atau lebih baru.

      • MySQL 8.0.2, versi revisi 8.0.2.2.25 atau lebih baru.

  • Minmax indexes

    Menyimpan nilai minimum dan maksimum untuk setiap blok data. Kondisi filter dibandingkan dengan nilai-nilai ini untuk menentukan apakah blok tersebut perlu dipindai.

  • Token bloom filter

    Menyaring string dengan memisahkannya pada karakter non-alfanumerik. Misalnya, "I am IMCI" menjadi I |am|IMCI. Ini cocok untuk kueri fuzzy LIKE.

  • N-gram bloom filter

    Menyaring string dengan membaginya menjadi substring dengan panjang tertentu. Misalnya, string "storage" dengan ukuran n-gram 3 menjadi sto|tor|ora|rag|age. Ini cocok untuk kueri fuzzy LIKE.

Skenario

  • Bloom filter: Ideal untuk kondisi ekuivalen dan IN. Memberikan penyaringan kuat ketika kondisi ekuivalen memiliki selektivitas tinggi, misalnya saat menyaring berdasarkan ID string.

  • Minmax indexes: Efektif ketika data kolom memiliki lokalitas baik, terutama untuk filter rentang dan ekuivalen, seperti klausa WHERE dengan bidang tanggal atau bidang terurut.

  • Token bloom filters dan n-gram bloom filters secara cepat mengeliminasi blok data yang tidak sesuai dalam kueri fuzzy LIKE.

Overhead penyimpanan

Mengaktifkan pruner untuk kolom bertipe string menambah overhead penyimpanan dan memori. Anda dapat memilih jenis pruner—seperti bloom filter, minmax indexes, token bloom filter, atau n-gram bloom filter—berdasarkan skenario penggunaan. Rumus penggunaan memori adalah sebagai berikut:

  • Bloom filter, token bloom filter, atau n-gram bloom filter

    • Dengan ukuran blok default 64.000 baris dan jumlah nilai unik yang melebihi 3% dari total baris:

      Penggunaan memori = 1,2 × jumlah kolom dengan bloom filter × total baris tabel (byte)

    • Dengan ukuran blok default 64.000 baris dan jumlah nilai unik yang kurang dari atau sama dengan 3% dari total baris:

      Penggunaan memori = 1,2 × jumlah kolom dengan bloom filter × jumlah nilai unik (byte)

      Dalam kasus ini, efektivitas bloom filter bergantung pada lokalitas data. Performa buruk jika data terdistribusi secara merata.

  • Minmax indexes

    Rumus penggunaan memorinya adalah sebagai berikut:

    Penggunaan memori = 2 × jumlah kolom dengan minmax indexes × (total baris tabel / ukuran blok) × panjang awalan × panjang pengkodean karakter

    Sebagai contoh, tabel dengan 2 miliar baris, minmax indexes pada 10 kolom, panjang awalan 20, ukuran blok 64.000, dan pengkodean utf8mb4 (4 byte per karakter) menggunakan sekitar 46 MB memori.

Pertimbangan

  • Untuk kluster yang menjalankan PolarDB MySQL versi 8.0.1.1.32 atau lebih lama, atau 8.0.2.2.13 atau lebih lama, pruner tidak dibangun untuk blok data yang berisi nilai NULL. Penyaringan dengan IS NULL atau IS NOT NULL tidak didukung.

  • Untuk kluster yang menjalankan PolarDB MySQL versi 8.0.1.1.35 atau lebih baru, atau 8.0.2.2.16 atau lebih baru, pruner secara otomatis dibangun untuk kolom bertipe string saat Anda membuat indeks penyimpanan kolom. Bloom filter menggunakan cache Least Recently Used (LRU) untuk manajemen memori. Jika Anda melakukan upgrade dari versi lama, Anda harus membangun ulang indeks penyimpanan kolom untuk mengaktifkan pruner pada kolom string.

  • Untuk kluster yang menjalankan PolarDB MySQL versi 8.0.1.1.34 atau lebih lama, atau 8.0.2.2.15 atau lebih lama, pruner tetap berada di memori secara permanen. Pruner tidak secara otomatis dibangun untuk kolom string selama pembuatan indeks penyimpanan kolom.

  • Untuk membangun pruner pada kolom bertipe string, pastikan string tersebut tidak mengandung '\0', misalnya 'polar\0db'.

  • Sistem secara otomatis membangun minmax indexes untuk tipe numerik, seperti INT, DECIMAL, dan DATETIME.

  • Minmax indexes tidak didukung untuk bidang JSON atau GEOMETRY.

  • Bloom filter tidak didukung untuk tipe numerik seperti INT, DECIMAL, dan DATETIME, atau untuk bidang JSON, BLOB, dan TEXT.

Referensi sintaksis

Anda dapat membangun pruner saat membuat tabel atau menambahkan/menghapusnya dari tabel yang sudah ada. Untuk memodifikasi pruner pada tabel yang sudah ada, Anda harus terlebih dahulu menghapus indeks penyimpanan kolom lalu membuatnya kembali. Sintaksisnya adalah sebagai berikut:

Catatan
  • Anda dapat menggunakan pernyataan Data Definition Language (DDL) untuk memodifikasi atribut COMMENT dalam skema tabel guna menambahkan atau menghapus pruner untuk kolom bertipe string.

  • Atribut COMMENT tingkat kolom memiliki prioritas lebih tinggi daripada atribut COMMENT tingkat tabel.

  • Versi yang lebih baru mendukung lebih banyak jenis pruner dan mengaktifkan jenis umum secara default, seperti minmax indexes dan bloom filter untuk string. Sebelum menambahkan pruner baru, periksa jenis pruner yang sudah ada pada setiap kolom. Untuk informasi selengkapnya, lihat Periksa Apakah Pruner Telah Dibangun pada Kolom Tabel.

Bangun pruner saat membuat tabel

  • Membuat pemangkas (bloom filter)

    Catatan

    Kluster yang menjalankan PolarDB MySQL 8.0 dengan revisi 8.0.1.1.32 atau lebih baru, atau 8.0.2.2.13 atau lebih baru, mendukung atribut PRUNER_BLOOM.

    • Bangun bloom filter untuk semua kolom yang didukung. Contoh:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10),
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_BLOOM=1"; /* atribut pruner_bloom dalam komentar */
    • Bangun bloom filter untuk kolom tertentu. Contoh:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10) "PRUNER_BLOOM=1", /* atribut pruner_bloom dalam komentar */
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1";
  • Membuat pemangkas (indeks minmaks)

    Untuk kolom string panjang, sistem membandingkan awalan string terhadap nilai minimum dan maksimum untuk mengurangi penggunaan memori. Panjang awalan default adalah 20 karakter, dan maksimum 255. Anda dapat menggunakan `PRUNER_MINMAX` untuk mengaktifkan minmax indexes string dan `PREFIX_LEN` untuk mengatur panjang awalan.

    Catatan
    • Hitungan karakter didasarkan pada jumlah karakter, bukan panjang pengkodean. Misalnya, 2 karakter pertama dari "Alibaba Cloud PolarDB" adalah "Al", dan 5 karakter pertama adalah "Aliba".

    • Kluster yang menjalankan PolarDB MySQL 8.0 dengan revisi 8.0.1.1.32 atau lebih baru, atau 8.0.2.2.13 atau lebih baru, mendukung atribut PRUNER_MINMAX dan PREFIX_LEN.

    • Bangun minmax indexes untuk semua kolom string. Contoh:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10),
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_MINMAX=1 PREFIX_LEN=30"; /* atribut pruner_minmax dengan awalan 30 karakter */
    • Bangun minmax indexes untuk kolom tertentu. Contoh:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10) "PRUNER_MINMAX=1 PREFIX_LEN=30", /* pruner_minmax dengan awalan 30 karakter */
          str_col2 varchar(10) "PRUNER_MINMAX=1 PREFIX_LEN=10" /* pruner_minmax dengan awalan 10 karakter */
        ) ENGINE InnoDB COMMENT "COLUMNAR=1";
  • Bangun prefix bloom filter

    Catatan

    Kluster yang menjalankan PolarDB MySQL 8.0 dengan revisi 8.0.1.1.42 atau lebih baru, atau 8.0.2.2.25 atau lebih baru, mendukung atribut PRUNER_PREFIX_BLOOM.

    • Bangun prefix bloom filter untuk semua kolom yang didukung. Contoh:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10),
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_PREFIX_BLOOM=1"; /* PRUNER_PREFIX_BLOOM dalam komentar tabel */
    • Bangun prefix bloom filter untuk kolom tertentu. Contoh:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10) "PRUNER_PREFIX_BLOOM=1", /* PRUNER_PREFIX_BLOOM dalam komentar kolom */
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1";
  • Membangun token bloom filter

    Catatan

    Atribut PRUNER_TOKEN_BLOOM didukung pada versi berikut:

    • PolarDB for MySQL 8.0.1, revisi 8.0.1.1.39 atau lebih baru.

    • PolarDB for MySQL 8.0.2, revisi 8.0.2.2.20 atau lebih baru.

    • Anda dapat membangun token bloom filter untuk semua kolom yang didukung. Contohnya:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10),
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_TOKEN_BLOOM=1";
    • Anda dapat membangun token bloom filter untuk kolom tertentu. Contohnya:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10) "PRUNER_TOKEN_BLOOM=1",
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1";
  • Bangun n-gram bloom filter

    Catatan
    • Properti PRUNER_TOKEN_BLOOM didukung pada versi Kluster yang memenuhi kondisi berikut:

      • PolarDB MySQL 8.0.1 dengan revisi 8.0.1.1.39 atau lebih baru.

      • PolarDB MySQL 8.0.2 dengan revisi 8.0.2.2.20 atau lebih baru.

    • PRUNER_NGRAM_BLOOM=N: N harus bernilai 2 atau lebih besar dan menentukan panjang substring. Kami menyarankan agar Anda mengatur N ke nilai yang kurang dari atau sama dengan panjang string dalam LIKE "%string%". Jika string dalam LIKE "%string%" lebih pendek dari N, n-gram bloom filter tidak dapat digunakan.

    • Bangun n-gram bloom filter untuk semua kolom yang didukung. Contoh:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10),
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1 PRUNER_NGRAM_BLOOM=2";
    • Bangun n-gram bloom filter untuk kolom tertentu. Contoh:

      CREATE TABLE
        t1 (
          id INT PRIMARY KEY,
          str_col1 char(10) "PRUNER_NGRAM_BLOOM=3",
          str_col2 varchar(10)
        ) ENGINE InnoDB COMMENT "COLUMNAR=1";

Bangun atau hapus pruner pada tabel yang sudah ada

Untuk menambahkan atau menghapus pruner pada tabel yang sudah ada, Anda harus membangun ulang indeks penyimpanan kolom dengan terlebih dahulu menghapusnya lalu membuatnya kembali. Sebelum membangun ulang indeks, perbarui atau hapus atribut pruner dalam COMMENT. Bagian berikut menggunakan PRUNER_MINMAX sebagai contoh.

  • Membuat pemangkas

    Asumsikan struktur tabel asli adalah sebagai berikut:

           Table: t1
    Create Table: CREATE TABLE `t1` (
      `id` int(11) NOT NULL,
      `str_col1` char(10) DEFAULT NULL,
      `str_col2` varchar(10) DEFAULT NULL,
      PRIMARY KEY (`id`),
      COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'
    • Bangun pruner minmax untuk semua kolom string pada tabel t1:

      1. Hapus indeks penyimpanan kolom pada tabel t1.

        ALTER TABLE t1 COMMENT = "COLUMNAR=0";
      2. Aktifkan pruner minmax untuk semua kolom string pada tabel t1.

        ALTER TABLE t1 COMMENT = "COLUMNAR=1 PRUNER_MINMAX=1"; 
      3. (Opsional) Lihat struktur tabel yang telah diperbarui.

        SHOW CREATE TABLE t1 FULL \G

        Hasil:

        *************************** 1. row ***************************
               Table: t1
        Create Table: CREATE TABLE `t1` (
          `id` int(11) NOT NULL,
          `str_col1` char(10) DEFAULT NULL,
          `str_col2` varchar(10) DEFAULT NULL,
          PRIMARY KEY (`id`),
          COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1 PRUNER_MINMAX=1'

        Tabel t1 sekarang mencakup atribut PRUNER_MINMAX.

    • Bangun pruner minmax untuk kolom str_col1 pada tabel t1:

      1. Tambahkan pruner ke kolom str_col1.

        ALTER TABLE t1 MODIFY COLUMN str_col1 char(10) COMMENT 'PRUNER_MINMAX=1';
      2. Jalankan perintah berikut secara berurutan untuk membangun ulang indeks penyimpanan kolom untuk tabel t1.

        ALTER TABLE t1 COMMENT = "COLUMNAR=0";
        ALTER TABLE t1 COMMENT = "COLUMNAR=1";
      3. (Opsional) Lihat struktur tabel yang telah diperbarui.

        SHOW CREATE TABLE t1 FULL \G

        Hasil:

        *************************** 1. row ***************************
               Table: t1
        Create Table: CREATE TABLE `t1` (
          `id` int(11) NOT NULL,
          `str_col1` char(10) DEFAULT NULL COMMENT 'PRUNER_MINMAX=1',
          `str_col2` varchar(10) DEFAULT NULL,
          PRIMARY KEY (`id`),
          COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'

        Kolom str_col1 sekarang memiliki atribut PRUNER_MINMAX.

  • Hapus pruner

    • Hapus atribut PRUNER_MINMAX dari tabel.

      Asumsikan tabel t1 memiliki struktur berikut:

      SHOW CREATE TABLE t1 full \G
      *************************** 1. row ***************************
             Table: t1
      Create Table: CREATE TABLE `t1` (
        `id` int(11) NOT NULL,
        `str_col1` char(10) DEFAULT NULL,
        `str_col2` varchar(10) DEFAULT NULL,
        PRIMARY KEY (`id`),
        COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1 PRUNER_MINMAX=1'

      Untuk menghapus atribut PRUNER_MINMAX dari tabel t1:

      1. Jalankan perintah berikut untuk menghapus indeks penyimpanan kolom pada tabel t1.

        ALTER TABLE t1 COMMENT = "COLUMNAR=0";
      2. Atur PRUNER_MINMAX ke 0 dan bangun ulang indeks.

        ALTER TABLE t1 COMMENT = "COLUMNAR=1 PRUNER_MINMAX=0";
      3. (Opsional) Lihat struktur tabel yang telah diperbarui.

        SHOW CREATE TABLE t1 FULL \G

        Hasil:

        *************************** 1. row ***************************
               Table: t1
        Create Table: CREATE TABLE `t1` (
          `id` int(11) NOT NULL,
          `str_col1` char(10) DEFAULT NULL,
          `str_col2` varchar(10) DEFAULT NULL,
          PRIMARY KEY (`id`),
          COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'

        Tabel t1 tidak lagi memiliki atribut PRUNER_MINMAX.

    • Hapus atribut PRUNER dari kolom.

      Asumsikan kolom str_col1 pada tabel t1 memiliki atribut PRUNER_MINMAX. Struktur tabelnya adalah sebagai berikut:

             Table: t1
      Create Table: CREATE TABLE `t1` (
        `id` int(11) NOT NULL,
        `str_col1` char(10) DEFAULT NULL COMMENT 'PRUNER_MINMAX=1',
        `str_col2` varchar(10) DEFAULT NULL,
        PRIMARY KEY (`id`),
        COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'

      Untuk menghapus atribut PRUNER_MINMAX dari kolom str_col1:

      1. Hapus atribut PRUNER_MINMAX dari kolom str_col1.

        ALTER TABLE t1 MODIFY COLUMN str_col1 char(10) COMMENT 'PRUNER_MINMAX=0';
      2. Bangun ulang indeks penyimpanan kolom.

        ALTER TABLE t1 COMMENT = "COLUMNAR=0";
        ALTER TABLE t1 COMMENT = "COLUMNAR=1";
      3. (Opsional) Lihat struktur tabel yang telah diperbarui.

        SHOW CREATE TABLE t1 FULL \G

        Hasil:

        *************************** 1. row ***************************
               Table: t1
        Create Table: CREATE TABLE `t1` (
          `id` int(11) NOT NULL,
          `str_col1` char(10) DEFAULT NULL,
          `str_col2` varchar(10) DEFAULT NULL,
          PRIMARY KEY (`id`),
          COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1'

        Kolom str_col1 tidak lagi memiliki atribut PRUNER_MINMAX.

Periksa apakah pruner telah dibangun pada kolom tabel

Versi 8.0.1.1.42 atau lebih baru, atau 8.0.2.2.25 atau lebih baru

Anda dapat memeriksa tabel information_schema.imci_secondary_indexes. Bidang INDEX_TYPE menampilkan jenis pruner untuk kolom string. Jika pruner ada, jenisnya akan muncul di bidang ini.

Catatan

Pada versi 8.0.1.1.42 atau lebih baru, atau 8.0.2.2.25 atau lebih baru, tabel information_schema.imci_secondary_indexes ditingkatkan dengan lebih banyak bidang.

SELECT * FROM information_schema.imci_secondary_indexes \G
*************************** 1. row ***************************
         TABLE_ID: 1111
      SCHEMA_NAME: test_imci
       TABLE_NAME: lineitem
      COLUMN_NAME: l_returnflag -- nama kolom
       INDEX_TYPE: MinMax,PrefixBloom -- jenis pruner: minmax dan prefix bloom filter
  MINMAX_RE_PACKS: 0 -- jumlah paket yang dilewati oleh pruner minmax
  MINMAX_AC_PACKS: 0 -- jumlah paket yang diterima (semua catatan sesuai; tidak perlu predikat per baris)
MINMAX_TEST_PACKS: 0 -- jumlah evaluasi pruner minmax
   BLOOM_RE_PACKS: 0 -- jumlah paket yang dilewati oleh bloom filter
 BLOOM_TEST_PACKS: 0 -- jumlah evaluasi bloom filter

Versi sebelum 8.0.1.1.42 atau 8.0.2.2.25

Anda dapat memeriksa tabel information_schema.imci_secondary_indexes. Bidang STR_BLOOM_PRUNER dan STR_MINMAX_PRUNER menunjukkan status pruner. Nilai 1 menunjukkan bahwa pruner telah dibangun.

SELECT * FROM information_schema.imci_secondary_indexes WHERE schema_name='test_tmp' AND table_name='t1'\G
*************************** 1. row ***************************
         TABLE_ID: 1091
      SCHEMA_NAME: test_tmp
       TABLE_NAME: t1
      COLUMN_NAME: str_col1
 STR_BLOOM_PRUNER: 1 -- bloom filter dibangun untuk str_col1
STR_MINMAX_PRUNER: 1 -- minmax dibangun untuk str_col1
    SINDEX_SWITCH: 0
*************************** 2. row ***************************
         TABLE_ID: 1091
      SCHEMA_NAME: test_tmp
       TABLE_NAME: t1
      COLUMN_NAME: str_col2
 STR_BLOOM_PRUNER: 1 -- bloom filter dibangun untuk str_col2
STR_MINMAX_PRUNER: 1 -- minmax dibangun untuk str_col2
    SINDEX_SWITCH: 0

Hasil kueri menunjukkan bahwa nilai status 1 pada bidang STR_BLOOM_PRUNER menunjukkan bahwa bloom filter telah dibangun untuk str_col1 dan str_col2. Nilai status 1 pada bidang STR_MINMAX_PRUNER menunjukkan bahwa indeks minmax telah dibangun untuk str_col1 dan str_col2.

Verifikasi efektivitas pruner

Periksa menggunakan SHOW STATUS

Sebelum dan sesudah menjalankan kueri, Anda dapat menggunakan SHOW STATUS LIKE 'imci_pruner%' untuk memeriksa penyaringan blok data dan mengonfirmasi dampak pruner. Nilainya merupakan metrik kumulatif pruner untuk sesi saat ini. Untuk kueri multi-tabel, hasilnya dijumlahkan dari semua tabel. Nilai status dijelaskan sebagai berikut:

  • imci_pruner_accepted: Jumlah blok data yang sepenuhnya memenuhi kondisi filter.

  • imci_pruner_rejected: Jumlah blok data yang gagal memenuhi kondisi filter.

Total jumlah blok yang dilewati adalah jumlah blok yang diterima ditambah blok yang ditolak.

Blok yang diterima melewati penyaringan per-catatan, meskipun materialisasi mungkin tetap memerlukan akses. Blok yang ditolak melewati proses pemindaian sepenuhnya, dan tidak terjadi I/O.

Example

Ambil tabel t1 sebagai contoh untuk menentukan apakah pruner efektif untuk pernyataan pencarian. Skema tabel t1 adalah sebagai berikut:

       Table: t1
Create Table: CREATE TABLE `t1` (
  `id` int(11) NOT NULL,
  `str_col1` char(10) DEFAULT NULL,
  `str_col2` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  COLUMNAR INDEX (`id`,`str_col1`,`str_col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='COLUMNAR=1 PRUNER=1'

Asumsikan tabel berisi 10 blok data, dan catatan yang memenuhi kondisi str_col1='polardb' terkonsentrasi dalam satu blok data. Anda dapat melakukan langkah-langkah berikut untuk memeriksa apakah pruner berpengaruh pada pernyataan pencarian SELECT COUNT(1) FROM t1 WHERE str_col1='polardb'.

  1. Periksa status pruner saat ini.

    SHOW STATUS LIKE  'imci_pruner%';

    Hasil:

    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | imci_pruner_accepted | 0     |
    | imci_pruner_rejected | 0     |
    +----------------------+-------+
    2 rows in set (0.00 sec)
  2. Jalankan perintah berikut untuk mengkueri jumlah baris yang memenuhi kondisi str_col1='polardb'.

    SELECT COUNT(1) FROM t1 WHERE str_col1='polardb';

    Hasil:

    +----------+
    | count(1) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.01 sec)
  3. Periksa status pruner lagi.

    SHOW STATUS LIKE  'imci_pruner%';

    Hasil:

    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | imci_pruner_accepted | 0     |
    | imci_pruner_rejected | 9     |
    +----------------------+-------+
    2 rows in set (0.00 sec)

    Nilai imci_pruner_accepted adalah 0 dan nilai imci_pruner_rejected adalah 9. Kueri melewati 9 blok, yang mengonfirmasi efektivitas pruner.

Periksa menggunakan imci_sql_profiling

Catatan

Fitur ini hanya didukung di PolarDB MySQL 8.0 dengan revisi 8.0.1.1.5 atau lebih baru, atau 8.0.2.2.29 atau lebih baru.

Anda dapat mengkueri information_schema.imci_sql_profiling untuk melihat berapa banyak paket data yang difilter oleh operator Table Scan menggunakan pruner dalam rencana eksekusi. Berbeda dengan pemeriksaan menggunakan SHOW STATUS, metode ini menunjukkan penyaringan tingkat tabel yang langsung terkait dengan kueri. Perintah SHOW STATUS bersifat sesi dan memerlukan perhitungan delta manual. Oleh karena itu, metode ini lebih intuitif.

  1. Aktifkan profiling kueri indeks penyimpanan kolom.

    SET imci_analyze_query=ON;
  2. Jalankan kueri, misalnya:

    SELECT count(*) from t1 WHERE v1 > 100;
    +--------------+
    | count(*)     |
    +--------------+
    | 600          |
    +--------------+
  3. Periksa tabel imci_sql_profiling.

    SELECT `Operator`, `Extra Info` from INFORMATION_SCHEMA.IMCI_SQL_PROFILING;
    +----+------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
    | ID | Operator                                                                     | Extra Info                                                                                                |
    +----+------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------+
    |  1 | Select Statement                                                             | IMCI Execution Plan (max_dop = 32, real_dop = 32, max_query_mem = unlimited, real_query_mem = unlimited)  |
    |  2 | └─Aggregation                                                                |                                                                                                           |
    |  3 |   └─Table Scan	Cond: (v1 > 100), Pruner Counter: [AC: 8, RE: 1, PA: 2]     |                                                                                                           |
    +----+------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+

    AC: 8 menunjukkan bahwa 8 paket diterima. RE: 1 menunjukkan bahwa 1 paket ditolak. PA: 2 menunjukkan bahwa 2 paket sebagian cocok dan memerlukan penyaringan lebih lanjut.

Pengujian Performa

Bagian ini menjelaskan pengujian pada tabel dengan 120 juta baris, yang setara dengan sekitar 1.800 blok data, pada kluster 2-core, 4 GB. Kolom string col memiliki 80 juta nilai unik. Pengujian membandingkan performa kueri dengan dan tanpa bloom filter menggunakan pernyataan berikut:

SELECT COUNT(1) FROM t1 WHERE col='xxx'

Waktu kueri adalah sebagai berikut:

Membangun Bloom filter

Tanpa bloom filter

0,15 detik

18,6 detik

Kondisi col='xxx' dikombinasikan dengan bloom filter mengeliminasi sebagian besar blok data. Hanya beberapa blok yang dipindai, sehingga performa meningkat secara signifikan.