全部产品
Search
文档中心

PolarDB:Indeks terkluster

更新时间:Jul 03, 2025

PolarDB-X mendukung indeks terkluster. PolarDB-X secara otomatis mengelola kolom penutup dalam indeks sekunder global dan menyinkronkan data dari tabel dasar ke indeks terkluster. Dengan cara ini, data yang diminta dapat diquery langsung dari tabel indeks tanpa perlu memindai tabel dasar, sehingga mengurangi overhead sumber daya. Topik ini menjelaskan cara membuat dan menggunakan indeks terkluster.

Prasyarat

Versi kernel PolarDB-X Anda harus V5.4.9 atau lebih baru.

Catatan

  • Indeks terkluster adalah jenis indeks sekunder global yang spesial. Untuk informasi lebih lanjut tentang operasi dan batasan pada indeks terkluster, lihat GSI.
  • Secara default, kolom penutup dalam indeks terkluster mencakup semua kolom dalam tabel tersebut. Setelah Anda memperbarui kolom dalam tabel, modifikasi tersebut akan disinkronkan secara otomatis ke tabel indeks terkluster untuk memastikan konsistensi data antara tabel dasar dan tabel indeks terkluster.
  • Indeks lokal tabel dasar juga disinkronkan ke tabel indeks terkluster.

Sintaksis

Ketika membuat tabel atau indeks untuk suatu tabel, Anda dapat menambahkan kata kunci CLUSTERED ke klausa pembuatan indeks. Dengan cara ini, indeks yang dibuat merupakan indeks terkluster dari tabel tersebut.

  • Kode sampel berikut menunjukkan cara menggunakan pernyataan CREATE TABLE untuk membuat tabel dan indeks terkluster:
    CREATE [SHADOW] TABLE [IF NOT EXISTS] tbl_name
        (create_definition, ...)
        [table_options]
        [drds_partition_options]
    
    create_definition:
        [UNIQUE] CLUSTERED INDEX index_name [index_type] (index_col_name,...)
          [drds_partition_options] 
          [index_option] ...
    Catatan Jika tabel yang ingin Anda buat menggunakan primary key sebagai shard key, Anda tidak perlu menentukan aturan sharding dalam klausa [drds_partition_options].
  • Kode sampel berikut menunjukkan cara menggunakan pernyataan CREATE INDEX untuk membuat indeks terkluster:
    CREATE [UNIQUE]
        CLUSTERED INDEX index_name [index_type]
        ON tbl_name (index_col_name,...)
        [drds_partition_options]
        [index_option] ...
    Catatan Jika tabel tempat Anda ingin membuat indeks menggunakan primary key sebagai shard key, Anda tidak perlu menentukan aturan sharding dalam klausa [drds_partition_options].
  • Kode sampel berikut menunjukkan cara menggunakan pernyataan ALTER TABLE untuk membuat indeks terkluster:
    ALTER TABLE tbl_name
        alter_specification
    Kode sampel berikut menunjukkan cara menentukan klausa alter_specification:
    alter_specification:
      | ADD [UNIQUE] CLUSTERED {INDEX|KEY} index_name 
          [index_type] (index_col_name,...)
          [drds_partition_options] 
          [index_option] ...
    Catatan
    • Anda hanya dapat menentukan satu aturan sharding dalam klausa alter_specification untuk memodifikasi indeks terkluster suatu tabel.
    • Anda harus menentukan nama untuk indeks terkluster.
    • Jika tabel yang ingin Anda modifikasi menggunakan primary key sebagai shard key, Anda tidak perlu menentukan aturan sharding dalam klausa [drds_partition_options].

Contoh

Anda dapat menggunakan pernyataan berikut untuk membuat tabel bernama t_order dalam database PolarDB-X:

CREATE PARTITION TABLE `t_order` (
    ->   `t` timestamp null default CURRENT_TIMESTAMP,
    ->   `x` int default 3,
    ->   `order_id` varchar(20) DEFAULT NULL,
    ->   `seller_id` varchar(20) DEFAULT NULL
    -> );

Anda dapat menggunakan pernyataan berikut untuk membuat indeks terkluster untuk tabel t_order:

CREATE CLUSTERED INDEX `c_i` ON `t_order` (seller_id, x)

Setelah indeks terkluster dibuat, Anda dapat menggunakan pernyataan berikut untuk menanyakan skema tabel dasar dan memeriksa informasi tentang indeks terkluster:

SHOW CREATE TABLE t_order;

Dalam contoh ini, informasi berikut dikembalikan:

+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                                                                                                                                                                 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
  `t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `x` int(11) DEFAULT '3',
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  LOCAL KEY `_local_c_i` (`seller_id`, `x`),
  CLUSTERED INDEX `c_i`(`seller_id`, `x`) DBPARTITION BY HASH(`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4   |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.08 sec)

Anda dapat menggunakan pernyataan berikut untuk menanyakan skema indeks terkluster:

SHOW CREATE TABLE c_i;

Informasi yang dikembalikan menunjukkan bahwa indeks terkluster berisi semua kolom tabel dasar.

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                            |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| c_i   | CREATE TABLE `c_i` (
  `t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `x` int(11) DEFAULT '3',
  `order_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  KEY `auto_shard_key_seller_id` USING BTREE (`seller_id`),
  KEY `i_seller_id_x` USING BTREE (`seller_id`, `x`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4  dbpartition by hash(`seller_id`) |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)