全部产品
Search
文档中心

PolarDB:Pembagian CO_HASH

更新时间:Jul 06, 2025

Versi yang Didukung

Versi PolarDB-X harus 5.4.18-17047709 atau yang lebih baru.

Skenario yang Berlaku

Dalam skenario e-commerce, nilai dua kolom atau lebih dalam tabel pesanan bisnis mungkin memiliki kesamaan. Sebagai contoh, N digit terakhir dari kolom order_id sama dengan kolom buyer_id. Karena jumlah data dalam tabel pesanan bisnis sangat besar, Anda dapat membagi tabel pesanan secara horizontal berdasarkan N digit terakhir dari kolom order_id dan buyer_id. Dengan cara ini, aplikasi dapat mengarahkan data ke partisi fisik yang sama dalam skenario penempatan pesanan, baik membaca maupun menulis data berdasarkan ID pesanan atau ID pembeli. Ini mencegah banyak transaksi lintas database.

PolarDB-X mendukung kebijakan Pembagian CO_HASH untuk menyelesaikan masalah dalam skenario berikut:

  • Nilai dua kolom atau lebih dalam tabel yang akan dibagi memiliki kesamaan. Sebagai contoh, N digit pertama atau terakhir dari suatu kolom sama dengan kolom lainnya dalam tabel.

  • Data dapat diarahkan secara terpisah berdasarkan kolom kunci partisi yang berbeda pada saat yang bersamaan dalam tabel yang dipartisi. Kolom-kolom kunci partisi ini saling independen. Permintaan yang melibatkan kondisi kesetaraan pada salah satu kolom kunci partisi dapat memenuhi kondisi pemangkasan partisi.

Sintaksis

Dalam PolarDB-X, Anda dapat menggunakan kebijakan Pembagian CO_HASH untuk mengarahkan data berdasarkan nilai berbeda dari beberapa kolom kunci partisi pada saat yang bersamaan.

CREATE TABLE ... 
PARTITION BY CO_HASH(partition_expr_list) 
PARTITIONS number;

partition_expr_list:
  partition_expr, partition_expr [, partition_expr, ...]
  
partition_expr:
    partition_column	
  | partition_func(partition_column)


# Tentukan fungsi pembagian.
partition_func:
     
  | LEFT
  | SUBSTR
  | SUBSTRING
Catatan

Untuk informasi lebih lanjut tentang perbedaan antara Pembagian CO_HASH dan Pembagian HASH atau KEY, lihat tabel Perbandingan antara Pembagian COHASH, Pembagian HASH, dan Pembagian KEY pada topik "Ikhtisar".

Catatan Penggunaan

  • Anda tidak dapat menggunakan fungsi pembagian bersarang untuk kolom kunci partisi, seperti SUBSTR(SUBSTR(c1,-6),4).

  • Tipe data semua kolom kunci partisi harus identik dalam hal berikut:

    • Karakter set dan collation.

    • Definisi panjang dan presisi.

  • Secara default, tabel yang dipartisi dapat berisi hingga 8.192 partisi.

  • Secara default, kunci partisi dapat terdiri dari hingga lima kolom kunci partisi.

  • Pembagian CO_HASH hanya mendukung fungsi pembagian berikut:

    • RIGHT

    • LEFT

    • SUBSTR

Contoh

Sebagai contoh, enam digit terakhir dari kolom order_id sama dengan kolom buyer_id di setiap baris tabel bernama orders.

Jika Anda ingin mempartisi tabel orders berdasarkan enam digit terakhir dari kolom order_id dan buyer_id, serta mengarahkan nilai kolom order_id dan buyer_id dalam satu baris ke partisi yang sama, Anda dapat menggunakan sintaksis berikut:

CREATE TABLE t_orders(
 id bigint not null auto_increment, 
 seller_id bigint,
 order_id bigint, 
 buyer_id bigint,
 order_time datetime not null,
 primary key(id)
) 
PARTITION BY CO_HASH(
  	RIGHT(`order_id`,6) /* Dapatkan enam digit terakhir dari Kolom c1. */,
  	RIGHT(`buyer_id`,6) /* Dapatkan enam digit terakhir dari Kolom c2. */
)  
PARTITIONS 8;

Untuk informasi lebih lanjut tentang cara menggunakan kebijakan Pembagian CO_HASH dan fungsi pembagian lainnya, lihat Fungsi pembagian.

Batasan

Batasan pada tipe data

  • Tipe bilangan bulat: BIGINT, BIGINT UNSIGNED, INT, INT UNSIGNED, MEDIUMINT, MEDIUMINT UNSIGNED, SMALLINT, SMALLINT UNSIGNED, TINYINT, dan TINYINT UNSIGNED.

  • Tipe tanggal dan waktu: DATETIME, DATE, dan TIMESTAMP.

  • Tipe string: CHAR dan VARCHAR.

  • Tipe titik tetap: DECIMAL, di mana jumlah digit di bagian pecahan harus 0.

Batasan pada kolom kunci partisi

  • Anda harus memastikan kesamaan antara nilai kolom kunci partisi yang berbeda. PolarDB-X hanya memeriksa hasil routing tabel yang dipartisi. Nilai kolom kunci partisi yang berbeda dalam tabel yang dipartisi CO_HASH memiliki kesamaan. Saat Anda menulis baris data ke tabel yang dipartisi CO_HASH, nilai kolom kunci partisi yang berbeda dalam baris tersebut harus diarahkan ke partisi yang sama. Namun, PolarDB-X tidak menjamin kesamaan antara nilai kolom kunci partisi yang berbeda. Oleh karena itu, Anda harus memastikan kesamaan antara nilai kolom kunci partisi yang berbeda. PolarDB-X hanya memeriksa hasil routing tabel yang dipartisi dan tidak memverifikasi kesamaan data. Sebagai contoh, empat digit terakhir dari kolom c1 sama dengan kolom c2 dalam tabel Anda. Di PolarDB-X, baris yang nilainya pada Kolom c1 adalah 1001234 dan nilai pada Kolom c2 adalah 1320 dapat diarahkan ke Partisi 0. Dalam kasus ini, empat digit terakhir dari kolom c1 dan c2 berbeda.

  • PolarDB-X memberlakukan batasan pada penggunaan pernyataan DML untuk memodifikasi nilai kolom kunci partisi. Karena kesamaan antara nilai beberapa kolom kunci partisi dalam tabel yang dipartisi CO_HASH, PolarDB-X memberlakukan batasan pada penggunaan pernyataan DML untuk memodifikasi nilai kolom kunci partisi. Ini mencegah kesalahan dalam hasil routing tabel yang dipartisi CO_HASH.

    • Saat Anda menjalankan pernyataan INSERT atau REPLACE, jika nilai kolom kunci partisi yang berbeda dalam baris yang sama di klausa VALUES akan diarahkan ke partisi yang berbeda berdasarkan hasil yang dihasilkan oleh algoritma routing, pernyataan INSERT atau REPLACE dilarang dan kesalahan dilaporkan.

    • Saat Anda menjalankan pernyataan UPDATE atau UPSERT, jika klausa SET memodifikasi nilai kolom kunci partisi, nilai semua kolom kunci partisi harus dimodifikasi pada saat yang bersamaan. Sebagai contoh, jika kolom c1 dan c2 ditentukan sebagai kolom kunci partisi, Anda harus menjalankan pernyataan berikut: UPDATE t1 SET c1='xx',c2='yy' WHERE id=1. Setelah klausa SET memodifikasi nilai kolom kunci partisi, jika nilai kolom kunci partisi yang berbeda dalam baris yang sama akan diarahkan ke partisi yang berbeda, pernyataan UPDATE atau UPSERT dilarang dan kesalahan dilaporkan.

    • Setelah Anda mempartisi indeks sekunder global (GSI) menggunakan kebijakan Pembagian CO_HASH, jika operasi DML yang dilakukan pada tabel utama, seperti INSERT atau UPDATE, menyebabkan bahwa nilai kolom kunci partisi yang berbeda dalam baris yang sama di GSI tabel utama diarahkan ke partisi yang berbeda, operasi DML dilarang dan kesalahan dilaporkan.

  • PolarDB-X secara otomatis memproses nilai yang memiliki awalan 0 untuk kolom kunci partisi bertipe integer dalam tabel yang dipartisi CO_HASH. Karena kesamaan antara nilai kolom kunci partisi dalam tabel yang dipartisi CO_HASH, Anda perlu menggunakan fungsi pembagian seperti SUBSTR, LEFT, dan RIGHT untuk menentukan kolom kunci partisi. Setelah nilai beberapa tipe integer dipotong, 0 mungkin ditambahkan sebagai awalan nilai-nilai tersebut. Sebagai contoh, empat digit terakhir dari kolom c1 sama dengan kolom c2 dalam tabel Anda. Anda ingin menyisipkan baris yang nilainya pada Kolom c1 adalah 1000034 dan nilai pada Kolom c2 adalah 34. Dalam kasus ini, empat digit terakhir dari Kolom c1 adalah 0034. Dalam tabel yang dipartisi CO_HASH, setelah semua nilai asli dari kolom kunci partisi bertipe integer dipotong, nilai baru secara otomatis dikonversi ke tipe integer dari kolom kunci partisi dan kemudian diarahkan. Oleh karena itu, string 0034 dikonversi menjadi string 34. Kemudian, nilai hash dari string 34 dihitung dan diarahkan ke partisi. Dengan cara ini, awalan dari string 0034 diproses secara otomatis.