全部产品
Search
文档中心

PolarDB:CREATE TABLE (Mode DRDS)

更新时间:Jul 02, 2025

Dokumen ini menjelaskan penggunaan pernyataan CREATE TABLE untuk membuat tabel. Topik ini mencakup sintaks, klausa, parameter, serta metode dasar yang digunakan untuk membuat tabel dalam mode Distributed Relational Database Service (DRDS).

Sintaks

CREATE [SHADOW] TABLE [IF NOT EXISTS] tbl_name
    (create_definition, ...)
    [table_options]
    [drds_partition_options]

create_definition:
    col_name column_definition
  | mysql_create_definition
  | [UNIQUE] GLOBAL INDEX index_name [index_type] (index_sharding_col_name,...)
      [global_secondary_index_option]
      [index_option] ...

# Klausa terkait dengan indeks sekunder global
global_secondary_index_option:
    [COVERING (col_name,...)]
    [drds_partition_options]
    [VISIBLE|INVISIBLE]

# Klausa yang dapat digunakan untuk mengimplementasikan sharding database dan tabel
drds_partition_options:
    DBPARTITION BY db_partition_algorithm
    [TBPARTITION BY table_partition_algorithm [TBPARTITIONS num]]
    [LOCALITY=locality_option]

db_sharding_algorithm:
    HASH([col_name])
  | {YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
  | UNI_HASH(col_name)
  | RIGHT_SHIFT(col_name, n)
  | RANGE_HASH(col_name, col_name, n)

table_sharding_algorithm:
    HASH(col_name)
  | {MM|DD|WEEK|MMDD|YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
  | UNI_HASH(col_name)
  | RIGHT_SHIFT(col_name, n)
  | RANGE_HASH(col_name, col_name, n)

# Klausa yang dapat digunakan untuk menentukan lokasi penyimpanan tabel non-sharded saat pembuatan tabel
locality_option:
    'dn=storage_inst_id_list'

storage_inst_id_list:
    storage_inst_id[,storage_inst_id_list]
    
# Sintaks DDL MySQL
index_sharding_col_name:
    col_name [(length)] [ASC | DESC]

index_option:
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'

index_type:
    USING {BTREE | HASH}
Catatan
  • Edisi Standar tidak mendukung sintaksis sharding basis data dan tabel.

  • Sintaksis DDL PolarDB-X dikembangkan berdasarkan sintaksis MySQL. Bagian sebelumnya hanya menyoroti perbedaan antara sintaksis MySQL dan sintaksis DDL PolarDB-X. Untuk informasi lebih lanjut, lihat dokumentasi MySQL.

Klausa dan parameter untuk mengimplementasikan sharding database dan tabel

  • DBPARTITION BY hash(partition_key): Menentukan kunci shard basis data dan algoritma sharding basis data berbasis hash.

  • TBPARTITION BY { HASH(column) | {MM|DD|WEEK|MMDD|YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(column): Opsional. Klausa ini menentukan metode sharding tabel. Secara default, klausa ini bekerja seperti klausa DBPARTITION BY.

  • TBPARTITIONS num: Opsional. Klausa ini menentukan jumlah tabel fisik di setiap shard basis data. Nilai default dari parameter ini adalah 1. Jika sharding tabel tidak diperlukan, Anda tidak perlu mengonfigurasi parameter ini.

  • Untuk informasi lebih lanjut tentang fungsi sharding, lihat Fungsi Sharding.

Klausa dan parameter untuk mendefinisikan GSI

  • [UNIK] GLOBAL: Menentukan bahwa indeks adalah indeks sekunder global (GSI). UNIK GLOBAL menentukan bahwa indeks adalah GSI unik.

  • index_name: Menentukan nama indeks. Tabel indeks menggunakan nama yang sama.

  • index_type: Menentukan tipe indeks lokal pada kunci shard di tabel indeks. Untuk informasi lebih lanjut tentang tipe indeks lokal yang didukung, lihat dokumentasi MySQL.

  • index_sharding_col_name,...: Menentukan kolom indeks. Kolom indeks mencakup semua kolom kunci shard dari tabel indeks dan tidak menyertakan kolom lain. Untuk informasi selengkapnya, lihat Membuat dan Menggunakan GSI.

  • global_secondary_index_option: Menentukan sintaksis yang diperluas untuk GSI PolarDB-X.

    • COVERING (col_name,...): Menentukan kolom-kolom yang dicakup. Kolom-kolom yang dicakup mencakup semua kolom dari tabel indeks kecuali kolom-kolom indeks. Secara default, kolom-kolom yang dicakup mencakup kolom-kolom kunci utama dan kolom-kolom shard key dari tabel dasar. Untuk informasi lebih lanjut, lihat Buat dan Gunakan GSIs.

    • drds_partition_options: Menentukan satu atau beberapa klausa sharding untuk tabel indeks. Untuk informasi lebih lanjut, lihat bagian "Klausa dan Parameter untuk Sharding Basis Data dan Tabel" dari topik ini.

  • index_option: Menentukan atribut indeks lokal pada kunci shard dari tabel indeks. Untuk informasi selengkapnya, lihat dokumentasi MySQL.

Klausa tabel bayangan untuk pengujian stres ujung ke ujung

SHADOW: Membuat tabel bayangan untuk pengujian stres ujung ke ujung. Nama tabel harus menggunakan _test_ sebagai awalan. Nama tabel setelah awalan harus sama dengan nama tabel formal terkait, dan tabel formal harus dibuat sebelum tabel bayangan.

LOCALITY

Klausa LOCALITY menentukan lokasi penyimpanan tabel non-sharded.

Catatan
  • Setelah Anda menentukan lokasi penyimpanan database atau tabel non-sharded menggunakan klausa LOCALITY, Anda tidak dapat mengubah lokasi penyimpanan.

  • Lokasi penyimpanan tabel non-sharded dalam database independen dari lokasi penyimpanan database. Jika Anda tidak menentukan lokasi penyimpanan saat membuat tabel non-sharded di instance PolarDB-X, tabel disimpan pada node data acak. Tabel non-sharded berikutnya yang tidak Anda tentukan lokasi penyimpanannya juga akan disimpan pada node data yang sama.

Membuat tabel non-sharded

Buat tabel non-sharded. Tabel tersebut merupakan tabel logis.

CREATE TABLE single_tbl(
 id bigint not null auto_increment, 
 name varchar(30), 
 primary key(id)
);

Lihat topologi node tabel logis. Dalam contoh ini, topologi menunjukkan bahwa tabel non-sharded dibuat di database 0.

show topology from single_tbl;
+------+------------------------------------------------------------------+------------+
| ID   | GROUP_NAME                                                       | TABLE_NAME |
+------+------------------------------------------------------------------+------------+
|    0 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | single_tbl |
+------+------------------------------------------------------------------+------------+
1 row in set (0,01 sec)
            

Sebagai contoh, sebuah instance PolarDB-X memiliki dua node data: polardbx-storage-0-master dan polardbx-storage-1-master. Sebuah database bernama db1 dibuat pada node data polardbx-storage-1-master. Jika Anda ingin membuat tabel di database db1 dan menentukan polardbx-storage-0-master sebagai lokasi penyimpanan tabel, gunakan sintaks berikut:

CREATE TABLE tb1 (id int) LOCALITY='dn=polardbx-storage-0-master';

Setelah tabel dibuat, Anda dapat mengeksekusi pernyataan berikut untuk menanyakan topologi tabel:

SHOW TOPOLOGY FROM tb1;

Hasil berikut dikembalikan:

+----+------------------+------------+.
| ID | GROUP_NAME       | TABLE_NAME | 
+----+------------------+------------+
| 0  | DB1_000000_GROUP | tb1        |
+----+------------------+------------+
1 row in set
Catatan

Hasil sebelumnya menunjukkan bahwa tabel tb1 disimpan di shard database DB1_000000_GROUP.

Membuat tabel dan mendistribusikan data tabel menggunakan sharding database

Sebagai contoh, delapan shard basis data dibuat. Buat tabel dan shard data tabel menggunakan sharding basis data berdasarkan nilai hash kolom ID. Tabel tersebut merupakan tabel logis.

CREATE TABLE multi_db_single_tbl(
  id bigint not null auto_increment, 
  name varchar(30), 
  primary key(id)
) dbpartition by hash(id);

Lihat topologi node tabel logis. Dalam contoh ini, topologi menunjukkan bahwa satu shard tabel dibuat di masing-masing dari delapan shard basis data. Shard tabel tidak di-shard lebih lanjut.

show topology from multi_db_single_tbl;
+------+------------------------------------------------------------------+---------------------+
| ID   | GROUP_NAME                                                       | TABLE_NAME          |
+------+------------------------------------------------------------------+---------------------+
|    0 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | multi_db_single_tbl |
|    1 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | multi_db_single_tbl |
|    2 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0002_RDS | multi_db_single_tbl |
|    3 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0003_RDS | multi_db_single_tbl |
|    4 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0004_RDS | multi_db_single_tbl |
|    5 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0005_RDS | multi_db_single_tbl |
|    6 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0006_RDS | multi_db_single_tbl |
|    7 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | multi_db_single_tbl |
+------+------------------------------------------------------------------+---------------------+
8 rows in set (0,01 sec)

Membuat tabel dan mendistribusikan data tabel menggunakan sharding database dan tabel

Anda dapat menggunakan salah satu metode sharding berikut untuk mengimplementasikan sharding basis data dan tabel:

  • Gunakan fungsi hash untuk sharding.

  • Gunakan fungsi hash yang berisi dua bidang untuk sharding.

  • Gunakan fungsi tanggal untuk sharding.

Catatan

Dalam contoh-contoh berikut, delapan shard basis data dibuat.

Gunakan fungsi hash untuk sharding

Buat tabel dan distribusikan data tabel menggunakan sharding basis data dan tabel. Gunakan fungsi hash pada kolom ID untuk mendistribusikan data di delapan shard basis data, lalu gunakan fungsi hash untuk menshard data di setiap shard basis data menjadi tiga tabel fisik berdasarkan kolom bid.

CREATE TABLE multi_db_multi_tbl(
 id bigint not null auto_increment, 
 bid int, 
 name varchar(30), 
 primary key(id)
) dbpartition by hash(id) tbpartition by hash(bid) tbpartitions 3;

Tanyakan topologi node tabel logis. Dalam contoh ini, topologi menunjukkan bahwa tiga shard tabel dibuat di setiap shard basis data.

show topology from multi_db_multi_tbl;
+------+------------------------------------------------------------------+-----------------------+
| ID   | GROUP_NAME                                                       | TABLE_NAME            |
+------+------------------------------------------------------------------+-----------------------+
|    0 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | multi_db_multi_tbl_00 |
|    1 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | multi_db_multi_tbl_01 |
|    2 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | multi_db_multi_tbl_02 |
|    3 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | multi_db_multi_tbl_03 |
|    4 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | multi_db_multi_tbl_04 |
|    5 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | multi_db_multi_tbl_05 |
|    6 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0002_RDS | multi_db_multi_tbl_06 |
|    7 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0002_RDS | multi_db_multi_tbl_07 |
|    8 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0002_RDS | multi_db_multi_tbl_08 |
|    9 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0003_RDS | multi_db_multi_tbl_09 |
|   10 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0003_RDS | multi_db_multi_tbl_10 |
|   11 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0003_RDS | multi_db_multi_tbl_11 |
|   12 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0004_RDS | multi_db_multi_tbl_12 |
|   13 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0004_RDS | multi_db_multi_tbl_13 |
|   14 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0004_RDS | multi_db_multi_tbl_14 |
|   15 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0005_RDS | multi_db_multi_tbl_15 |
|   16 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0005_RDS | multi_db_multi_tbl_16 |
|   17 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0005_RDS | multi_db_multi_tbl_17 |
|   18 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0006_RDS | multi_db_multi_tbl_18 |
|   19 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0006_RDS | multi_db_multi_tbl_19 |
|   20 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0006_RDS | multi_db_multi_tbl_20 |
|   21 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | multi_db_multi_tbl_21 |
|   22 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | multi_db_multi_tbl_22 |
|   23 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | multi_db_multi_tbl_23 |
+------+------------------------------------------------------------------+-----------------------+
24 rows in set (0,01 sec)

Tanyakan aturan sharding tabel logis. Dalam contoh ini, aturan menggunakan fungsi hash berdasarkan kolom kunci shard basis data ID untuk mengimplementasikan sharding basis data dan menggunakan fungsi hash berdasarkan kolom bid untuk mengimplementasikan sharding tabel.

show rule from multi_db_multi_tbl;
+------+--------------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
| ID   | TABLE_NAME         | BROADCAST | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT |
+------+--------------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
|    0 | multi_db_multi_tbl |         0 | id               | hash                | 8                  | bid              | hash                | 3                  |
+------+--------------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
1 row in set (0,01 sec)

Gunakan fungsi hash yang berisi dua bidang untuk sharding

  • Kunci shard harus bertipe karakter atau numerik.

  • Metode routing: Nilai hash dihitung berdasarkan N karakter terakhir dari satu kunci shard untuk menentukan shard spesifik tempat data disimpan. N menentukan parameter ketiga untuk fungsi hash. Misalnya, jika fungsi RANGE_HASH(COL1, COL2, N) digunakan, COL1 dipilih dan kemudian dipotong untuk mendapatkan N karakter terakhir untuk perhitungan. Jika COL1 tidak ada, COL2 dipilih untuk perhitungan.

  • Skenario: Dua kunci shard diperlukan untuk sharding basis data dan query dapat diarahkan dengan benar berdasarkan satu kunci shard. Misalnya, database PolarDB-X memiliki delapan shard basis data fisik.

    • Database perlu di-shard berdasarkan ID pembeli dan ID pesanan.

    • Hanya ID pembeli atau ID pesanan yang tersedia untuk query.

Dalam hal ini, Anda dapat mengeksekusi pernyataan DDL berikut untuk membuat tabel pesanan:

create table test_order_tb (
 id bigint not null auto_increment,
 seller_id varchar(30) DEFAULT NULL,
 order_id varchar(30) DEFAULT NULL,
 buyer_id varchar(30) DEFAULT NULL,
 create_time datetime DEFAULT NULL,
 primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by RANGE_HASH(buyer_id, order_id, 10) tbpartition by RANGE_HASH(buyer_id, order_id, 10) tbpartitions 3;  
Catatan
  • Dua kunci shard tidak dapat dimodifikasi.

  • Jika dua kunci shard menunjuk ke shard basis data atau shard tabel yang berbeda, data gagal dimasukkan.

Gunakan fungsi tanggal untuk sharding

Selain fungsi hash, Anda juga dapat menggunakan fungsi tanggal MM, DD, WEEK, atau MMDD sebagai algoritma sharding untuk menshard tabel. Contoh berikut menunjukkan cara menggunakan fungsi tanggal untuk sharding.

Buat tabel dan distribusikan data tabel menggunakan sharding basis data dan tabel. Implementasikan sharding basis data berdasarkan nilai hash kolom userId. Implementasikan sharding tabel di setiap shard basis data berdasarkan nilai DAY_OF_WEEK yang dihitung dari kolom actionDate menggunakan fungsi WEEK(actionDate) untuk mendistribusikan data tabel ke tujuh tabel fisik.

Sebagai contoh, jika nilai di kolom actionDate adalah 2017-02-27, yaitu Senin, nilai yang dikembalikan oleh fungsi WEEK(actionDate) adalah 2. Dalam hal ini, rekaman data yang mencakup 2017-02-27 disimpan di shard tabel yang sesuai dengan 2 berdasarkan persamaan berikut: 2(2 % 7 = 2). Shard tabel tersebut berada di shard basis data dan dinamai user_log_2. Jika nilai di kolom actionDate adalah 2017-02-26, yaitu Minggu, nilai yang dikembalikan oleh fungsi WEEK(actionDate) adalah 1. Dalam hal ini, rekaman data yang mencakup 2017-02-26 disimpan di shard tabel yang sesuai dengan 1 berdasarkan persamaan berikut: 1(1 % 7 = 1). Shard tabel tersebut berada di shard basis data dan dinamai user_log_1.

CREATE TABLE user_log(
 userId int, 
 name varchar(30), 
 operation varchar(30), 
 actionDate DATE
) dbpartition by hash(userId) tbpartition by WEEK(actionDate) tbpartitions 7;

Tanyakan topologi node tabel logis. Dalam contoh ini, topologi menunjukkan bahwa tujuh shard tabel dibuat di setiap shard basis data berdasarkan hari kerja dalam seminggu.

show topology from user_log;
+------+------------------------------------------------------------------+------------+
| ID   | GROUP_NAME                                                       | TABLE_NAME |
+------+------------------------------------------------------------------+------------+
|    0 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log_0 |
|    1 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log_1 |
|    2 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log_2 |
|    3 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log_3 |
|    4 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log_4 |
|    5 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log_5 |
|    6 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log_6 |
|    7 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log_0 |
|    8 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log_1 |
|    9 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log_2 |
|   10 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log_3 |
|   11 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log_4 |
|   12 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log_5 |
|   13 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log_6 |
...
|   49 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log_0 |
|   50 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log_1 |
|   51 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log_2 |
|   52 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log_3 |
|   53 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log_4 |
|   54 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log_5 |
|   55 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log_6 |
+------+------------------------------------------------------------------+------------+
56 rows in set (0,01 sec)
Catatan

Elipsis (…) digunakan untuk menghilangkan beberapa data karena hasil yang dikembalikan panjang.

Tanyakan aturan sharding tabel logis. Dalam contoh ini, aturan menggunakan fungsi hash berdasarkan kunci shard basis data userId untuk mengimplementasikan sharding basis data, dan menggunakan fungsi tanggal WEEK berdasarkan kunci shard tabel actionDate untuk mengimplementasikan sharding tabel.

show rule from user_log;
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
| ID   | TABLE_NAME | BROADCAST | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
|    0 | user_log   |         0 | userId           | hash                | 8                  | actionDate       | week                | 7                  |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
1 row in set (0,00 sec)

Dengan cara ini, jika Anda menentukan kunci shard basis data dan kunci shard tabel, Anda dapat menanyakan shard basis data fisik dan tabel fisik yang termasuk dalam shard basis data fisik ke mana pernyataan SQL diarahkan.

Buat tabel dan distribusikan data tabel menggunakan sharding basis data dan tabel. Implementasikan sharding basis data berdasarkan nilai hash kolom userId. Implementasikan sharding tabel di setiap shard basis data berdasarkan nilai MONTH_OF_YEAR yang dihitung dari kolom actionDate menggunakan fungsi tanggal MM(actionDate) untuk mendistribusikan data tabel ke 12 tabel fisik.

Sebagai contoh, jika nilai di kolom actionDate adalah 2017-02-27, nilai yang dikembalikan oleh fungsi MM(actionDate) adalah 02. Dalam hal ini, rekaman data yang mencakup 2017-02-27 disimpan di shard tabel yang sesuai dengan 02 berdasarkan persamaan berikut: 02(02 % 12 = 02). Shard tabel tersebut berada di shard basis data dan dinamai user_log_02. Sebagai contoh, jika nilai di kolom actionDate adalah 2016-12-27, nilai yang dikembalikan oleh fungsi MM(actionDate) adalah 12. Dalam hal ini, rekaman data yang mencakup 2016-12-27 disimpan di shard tabel yang sesuai dengan 00 berdasarkan persamaan berikut:00(12 % 12 = 00). Shard tabel tersebut berada di shard basis data dan dinamai user_log_00.

CREATE TABLE user_log2(
 userId int, 
 name varchar(30), 
 operation varchar(30), 
 actionDate DATE
) dbpartition by hash(userId) tbpartition by MM(actionDate) tbpartitions 12; 

Tanyakan topologi node tabel logis. Dalam contoh ini, 12 shard tabel dibuat di setiap shard basis data berdasarkan bulan dalam setahun.

show topology from user_log2;
+------+------------------------------------------------------------------+--------------+
| ID   | GROUP_NAME                                                       | TABLE_NAME   |
+------+------------------------------------------------------------------+--------------+
|    0 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_00 |
|    1 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_01 |
|    2 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_02 |
|    3 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_03 |
|    4 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_04 |
|    5 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_05 |
|    6 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_06 |
|    7 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_07 |
|    8 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_08 |
|    9 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_09 |
|   10 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_10 |
|   11 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log2_11 |
|   12 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_00 |
|   13 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_01 |
|   14 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_02 |
|   15 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_03 |
|   16 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_04 |
|   17 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_05 |
|   18 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_06 |
|   19 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_07 |
|   20 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_08 |
|   21 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_09 |
|   22 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_10 |
|   23 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0001_RDS | user_log2_11 |
...
|   84 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_00 |
|   85 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_01 |
|   86 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_02 |
|   87 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_03 |
|   88 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_04 |
|   89 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_05 |
|   90 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_06 |
|   91 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_07 |
|   92 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_08 |
|   93 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_09 |
|   94 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_10 |
|   95 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log2_11 |
+------+------------------------------------------------------------------+--------------+
96 rows in set (0,02 sec)
Catatan

Elipsis (…) digunakan untuk menghilangkan beberapa data karena hasil yang dikembalikan panjang.

Tanyakan aturan sharding tabel logis. Dalam contoh ini, aturan menggunakan fungsi hash berdasarkan kunci shard basis data userId untuk mengimplementasikan sharding basis data, dan menggunakan fungsi tanggal MM berdasarkan kunci shard tabel actionDate untuk mengimplementasikan sharding tabel.

show rule from user_log2;
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
| ID   | TABLE_NAME | BROADCAST | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
|    0 | user_log2  |         0 | userId           | hash                | 8                  | actionDate       | mm                  | 12                 |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
1 row in set (0,00 sec)

Buat tabel dan distribusikan data tabel menggunakan sharding basis data dan tabel. Implementasikan sharding basis data berdasarkan nilai hash kolom userId. Implementasikan sharding tabel di setiap shard basis data berdasarkan nilai DAY_OF_MONTH yang dihitung menggunakan fungsi DD(actionDate) untuk mendistribusikan data tabel ke 31 tabel fisik.

Sebagai contoh, jika nilai di kolom actionDate adalah 2017-02-27, nilai yang dikembalikan oleh fungsi DD(actionDate) adalah 27. Dalam hal ini, rekaman data yang mencakup 2017-02-27 disimpan di shard tabel yang sesuai dengan 27 berdasarkan persamaan berikut: 27(27 % 31 = 27). Shard tabel ini berada di shard basis data dan dinamai user_log_27.

CREATE TABLE user_log3(
 userId int, 
 name varchar(30), 
 operation varchar(30), 
 actionDate DATE
) dbpartition by hash(userId) tbpartition by DD(actionDate) tbpartitions 31;

Tanyakan topologi node tabel logis. Dalam contoh ini, 31 shard tabel dibuat di setiap shard basis data berdasarkan hari dalam sebulan.

show topology from user_log3;
+------+------------------------------------------------------------------+--------------+
| ID   | GROUP_NAME                                                       | TABLE_NAME   |
+------+------------------------------------------------------------------+--------------+
|    0 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_00 |
|    1 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_01 |
|    2 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_02 |
|    3 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_03 |
|    4 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_04 |
|    5 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_05 |
|    6 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_06 |
|    7 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_07 |
|    8 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_08 |
|    9 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_09 |
|   10 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_10 |
|   11 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_11 |
|   12 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_12 |
|   13 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_13 |
|   14 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_14 |
|   15 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_15 |
|   16 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_16 |
|   17 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_17 |
|   18 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_18 |
|   19 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_19 |
|   20 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_20 |
|   21 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_21 |
|   22 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_22 |
|   23 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_23 |
|   24 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_24 |
|   25 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_25 |
|   26 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_26 |
|   27 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_27 |
|   28 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_28 |
|   29 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_29 |
|   30 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log3_30 |
...
|  237 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_20 |
|  238 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_21 |
|  239 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_22 |
|  240 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_23 |
|  241 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_24 |
|  242 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_25 |
|  243 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_26 |
|  244 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_27 |
|  245 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_28 |
|  246 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_29 |
|  247 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log3_30 |
+------+------------------------------------------------------------------+--------------+
248 rows in set (0,01 sec)
Catatan

Elipsis (…) digunakan untuk menghilangkan beberapa data karena hasil yang dikembalikan panjang.

Tanyakan aturan sharding tabel logis. Dalam contoh ini, aturan menggunakan fungsi hash berdasarkan kunci shard basis data userId untuk mengimplementasikan sharding basis data, dan menggunakan fungsi tanggal DD berdasarkan kunci shard tabel actionDate untuk mengimplementasikan sharding tabel.

show rule from user_log3;
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
| ID   | TABLE_NAME | BROADCAST | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
|    0 | user_log3  |         0 | userId           | hash                | 8                  | actionDate       | dd                  | 31                 |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
1 row in set (0,01 sec)

Buat tabel dan distribusikan data tabel dengan menggunakan sharding basis data dan sharding tabel. Implementasikan sharding basis data berdasarkan nilai hash kolom userId. Implementasikan sharding tabel di setiap shard basis data berdasarkan nilai DAY_OF_YEAR % 365 yang dihitung menggunakan fungsi tanggal MMDD(actionDate) tbpartitions 365 untuk mendistribusikan data tabel ke dalam 365 tabel fisik.

Sebagai contoh, jika nilai di kolom actionDate adalah 2017-02-27, nilai yang dikembalikan oleh fungsi MMDD(actionDate) adalah 58. Dalam hal ini, rekaman data yang mencakup 2017-02-27 disimpan di shard tabel yang sesuai dengan 58. Shard tabel tersebut berada di shard basis data dan dinamai user_log_58.

CREATE TABLE user_log4(
 userId int, 
 name varchar(30), 
 operation varchar(30), 
 actionDate DATE
) dbpartition by hash(userId) tbpartition by MMDD(actionDate) tbpartitions 365;

Tanyakan topologi node tabel logis. Dalam contoh ini, topologi node menunjukkan bahwa 365 shard tabel dibuat di setiap shard basis data berdasarkan hari dalam setahun.

show topology from user_log4;
+------+------------------------------------------------------------------+---------------+
| ID   | GROUP_NAME                                                       | TABLE_NAME   |
+------+------------------------------------------------------------------+---------------+
...
| 2896 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_341 |
| 2897 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_342 |
| 2898 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_343 |
| 2899 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_344 |
| 2900 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_345 |
| 2901 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_346 |
| 2902 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_347 |
| 2903 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_348 |
| 2904 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_349 |
| 2905 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_350 |
| 2906 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_351 |
| 2907 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_352 |
| 2908 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_353 |
| 2909 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_354 |
| 2910 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_355 |
| 2911 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_356 |
| 2912 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_357 |
| 2913 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_358 |
| 2914 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_359 |
| 2915 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_360 |
| 2916 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_361 |
| 2917 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_362 |
| 2918 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_363 |
| 2919 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log4_364 |
+------+------------------------------------------------------------------+---------------+
2920 rows in set (0,07 sec)
Catatan

Elipsis (…) digunakan untuk menghilangkan beberapa data karena hasil yang dikembalikan panjang.

Tanyakan aturan sharding tabel logis. Dalam contoh ini, aturan menggunakan fungsi hash berdasarkan kunci shard basis data userId untuk mengimplementasikan sharding basis data, dan menggunakan fungsi tanggal MMDD berdasarkan kunci shard tabel actionDate untuk mengimplementasikan sharding tabel.

show rule from user_log4;
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
| ID   | TABLE_NAME | BROADCAST | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
|    0 | user_log4  |         0 | userId           | hash                | 8                  | actionDate       | mmdd                | 365                |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
1 row in set (0,02 sec)

Buat tabel dan distribusikan data tabel menggunakan sharding basis data dan sharding tabel. Terapkan sharding basis data berdasarkan nilai hash dari kolom userId. Terapkan sharding tabel di setiap shard basis data berdasarkan nilai DAY_OF_YEAR % 10 yang dihitung menggunakan fungsi tanggal MMDD(actionDate) tbpartitions 10 untuk mendistribusikan data tabel ke dalam 10 tabel fisik.

CREATE TABLE user_log5(
 userId int, 
 name varchar(30), 
 operation varchar(30), 
 actionDate DATE
) dbpartition by hash(userId) tbpartition by MMDD(actionDate) tbpartitions 10;

Tanyakan topologi node tabel logis. Dalam contoh ini, topologi node menunjukkan bahwa 10 shard tabel dibuat di setiap shard basis data. Tabel logis di-shard menjadi 10 tabel fisik di setiap shard basis data berdasarkan hari dalam setahun (365 hari).

show topology from user_log5;
+------+------------------------------------------------------------------+--------------+
| ID   | GROUP_NAME                                                       | TABLE_NAME   |
+------+------------------------------------------------------------------+--------------+
|    0 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_00 |
|    1 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_01 |
|    2 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_02 |
|    3 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_03 |
|    4 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_04 |
|    5 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_05 |
|    6 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_06 |
|    7 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_07 |
|    8 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_08 |
|    9 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0000_RDS | user_log5_09 |
...
|   70 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_00 |
|   71 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_01 |
|   72 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_02 |
|   73 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_03 |
|   74 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_04 |
|   75 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_05 |
|   76 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_06 |
|   77 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_07 |
|   78 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_08 |
|   79 | SANGUAN_TEST_123_1488766060743ACTJSANGUAN_TEST_123_WVVP_0007_RDS | user_log5_09 |
+------+------------------------------------------------------------------+--------------+
80 rows in set (0,02 sec)
Catatan

Elipsis (…) digunakan untuk menghilangkan beberapa data karena hasil yang dikembalikan panjang.

Tanyakan aturan sharding tabel logis. Dalam contoh ini, aturan menggunakan fungsi hash berdasarkan kunci shard basis data userId untuk mengimplementasikan sharding basis data, dan menggunakan fungsi tanggal MMDD untuk mengimplementasikan sharding tabel berdasarkan kunci actionDate untuk merutekan data tabel ke 10 tabel fisik di setiap shard basis data.

show rule from user_log5;
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
| ID   | TABLE_NAME | BROADCAST | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
|    0 | user_log5  |         0 | userId           | hash                | 8                  | actionDate       | mmdd                | 10                 |
+------+------------+-----------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+
1 row in set (0,01 sec)

Atribut lainnya dalam pernyataan MySQL CREATE TABLE

Saat Anda menjalankan pernyataan MySQL CREATE TABLE untuk membuat tabel, Anda dapat menentukan metode sharding dan atribut lainnya untuk tabel tersebut. Contoh kode berikut memberikan contoh cara menentukan atribut lainnya:

CREATE TABLE multi_db_multi_tbl(
  id bigint not null auto_increment, 
  name varchar(30), 
  primary key(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(id) tbpartition by hash(id) tbpartitions 3;

Indeks Sekunder Global (GSIs)

Catatan

Dalam contoh-contoh berikut, delapan shard basis data dibuat.

Menentukan GSI

Examples

CREATE TABLE t_order (
 `id` bigint(11) NOT NULL AUTO_INCREMENT,
 `order_id` varchar(20) DEFAULT NULL,
 `buyer_id` varchar(20) DEFAULT NULL,
 `seller_id` varchar(20) DEFAULT NULL,
 `order_snapshot` longtext DEFAULT NULL,
 `order_detail` longtext DEFAULT NULL,
 PRIMARY KEY (`id`),
 GLOBAL INDEX `g_i_seller`(`seller_id`) dbpartition by hash(`seller_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);

  • t_order: Tabel dasar yang di-shard menggunakan sharding basis data berdasarkan nilai hash kolom order_id.

  • g_i_seller: Tabel indeks yang di-shard menggunakan sharding basis data berdasarkan nilai hash kolom seller_id. Tidak ada kolom covering yang ditentukan.

  • GLOBAL INDEX `g_i_seller`(`seller_id`) dbpartition by hash(`seller_id`): Klausa yang digunakan untuk mendefinisikan GSI.

Anda dapat menjalankan pernyataan SHOW INDEX untuk menanyakan informasi indeks. Dalam contoh ini, Anda dapat menanyakan indeks lokal pada kunci shard order_id dan GSIs pada kolom seller_id, id, dan order_id. seller_id adalah kunci shard tabel indeks, dan id dan order_id adalah kolom covering default. Kolom covering default mencakup kolom kunci utama dan kolom kunci shard dari tabel dasar.

show index from t_order;
+---------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
| TABLE   | NON_UNIQUE | KEY_NAME                | SEQ_IN_INDEX | COLUMN_NAME | COLLATION | CARDINALITY | SUB_PART | PACKED | NULL | INDEX_TYPE | COMMENT  | INDEX_COMMENT |
+---------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
| t_order |          0 | PRIMARY                 |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |          |               |
| t_order |          1 | auto_shard_key_order_id |            1 | order_id    | A         |           0 |     NULL | NULL   | YES  | BTREE      |          |               |
| t_order |          1 | g_i_seller              |            1 | seller_id   | NULL      |           0 |     NULL | NULL   | YES  | GLOBAL     | INDEX    |               |
| t_order |          1 | g_i_seller              |            2 | id          | NULL      |           0 |     NULL | NULL   |      | GLOBAL     | COVERING |               |
| t_order |          1 | g_i_seller              |            3 | order_id    | NULL      |           0 |     NULL | NULL   | YES  | GLOBAL     | COVERING |               |
+---------+------------+-------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+----------+---------------+

Anda dapat menjalankan pernyataan SHOW GLOBAL INDEX untuk menanyakan informasi tentang GSIs. Untuk informasi lebih lanjut, lihat SHOW GLOBAL INDEX.

 show global index from t_order;
+--------+---------+------------+------------+-------------+----------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
| SCHEMA | TABLE   | NON_UNIQUE | KEY_NAME   | INDEX_NAMES | COVERING_NAMES | INDEX_TYPE | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT | STATUS |
+--------+---------+------------+------------+-------------+----------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
| d7     | t_order | 1          | g_i_seller | seller_id   | id, order_id   | NULL       | seller_id        | HASH                | 8                  |                  | NULL                | NULL               | PUBLIC |
+--------+---------+------------+------------+-------------+----------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+

Anda dapat menjalankan pernyataan berikut untuk menanyakan skema tabel indeks. Tabel indeks berisi kunci utama dari tabel dasar, kunci shard, dan kolom covering default. Kolom kunci utama tidak memiliki atribut AUTO_INCREMENT, dan tabel dasar tidak memiliki indeks lokal.

show create table g_i_seller;
+------------+-----------------------------------------------------------+
| Table      | Create Table                                              |
+------------+-----------------------------------------------------------+
| g_i_seller | CREATE TABLE `g_i_seller` (
 `id` bigint(11) NOT NULL,
 `order_id` varchar(20) DEFAULT NULL,
 `seller_id` varchar(20) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `auto_shard_key_seller_id` (`seller_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`seller_id`) |
+------------+-----------------------------------------------------------+

Menentukan GSI unik

CREATE TABLE t_order (
 `id` bigint(11) NOT NULL AUTO_INCREMENT,
 `order_id` varchar(20) DEFAULT NULL,
 `buyer_id` varchar(20) DEFAULT NULL,
 `seller_id` varchar(20) DEFAULT NULL,
 `order_snapshot` longtext DEFAULT NULL,
 `order_detail` longtext DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE GLOBAL INDEX `g_i_buyer`(`buyer_id`) COVERING(`seller_id`, `order_snapshot`) 
   dbpartition by hash(`buyer_id`) tbpartition by hash(`buyer_id`) tbpartitions 3
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);

  • t_order: Tabel dasar yang di-shard menggunakan sharding basis data berdasarkan nilai hash kolom order_id.

  • g_i_buyer: Tabel indeks yang di-shard menggunakan sharding basis data dan tabel berdasarkan nilai hash kolom buyer_id. Kolom covering mencakup kolom seller_id dan order_snapshot.

  • UNIQUE GLOBAL INDEX 'g_i_buyer'('buyer_id') COVERING('seller_id', 'order_snapshot') dbpartition by hash('buyer_id') tbpartition by hash('buyer_id') tbpartitions 3: Klausa yang digunakan untuk mendefinisikan GSI unik.

Anda dapat menjalankan pernyataan SHOW INDEX untuk menanyakan informasi indeks. Dalam contoh ini, Anda dapat menanyakan indeks lokal pada kunci shard order_id dan GSI unik pada kolom buyer_id, id, order_id, seller_id, dan order_snapshot. buyer_id adalah kunci shard tabel indeks, dan id dan order_id adalah kolom covering default. Kolom covering default mencakup kolom kunci utama dan kolom kunci shard dari tabel dasar. seller_id dan order_snapshot adalah kolom covering yang ditentukan saat GSI unik didefinisikan.

show index from t_order;
+--------------+------------+-------------------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
| TABLE        | NON_UNIQUE | KEY_NAME                | SEQ_IN_INDEX | COLUMN_NAME    | COLLATION | CARDINALITY | SUB_PART | PACKED | NULL | INDEX_TYPE | COMMENT  | INDEX_COMMENT |
+--------------+------------+-------------------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+
| t_order_dthb |          0 | PRIMARY                 |            1 | id             | A         |           0 |     NULL | NULL   |      | BTREE      |          |               |
| t_order_dthb |          1 | auto_shard_key_order_id |            1 | order_id       | A         |           0 |     NULL | NULL   | YES  | BTREE      |          |               |
| t_order      |          0 | g_i_buyer               |            1 | buyer_id       | NULL      |           0 |     NULL | NULL   | YES  | GLOBAL     | INDEX    |               |
| t_order      |          1 | g_i_buyer               |            2 | id             | NULL      |           0 |     NULL | NULL   |      | GLOBAL     | COVERING |               |
| t_order      |          1 | g_i_buyer               |            3 | order_id       | NULL      |           0 |     NULL | NULL   | YES  | GLOBAL     | COVERING |               |
| t_order      |          1 | g_i_buyer               |            4 | seller_id      | NULL      |           0 |     NULL | NULL   | YES  | GLOBAL     | COVERING |               |
| t_order      |          1 | g_i_buyer               |            5 | order_snapshot | NULL      |           0 |     NULL | NULL   | YES  | GLOBAL     | COVERING |               |
+--------------+------------+-------------------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+

Anda dapat menjalankan pernyataan SHOW GLOBAL INDEX untuk menanyakan informasi tentang GSI. Untuk informasi lebih lanjut, lihat SHOW GLOBAL INDEX.

show global index from t_order;
+--------+---------+------------+-----------+-------------+-----------------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
| SCHEMA | TABLE   | NON_UNIQUE | KEY_NAME  | INDEX_NAMES | COVERING_NAMES                          | INDEX_TYPE | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT | STATUS |
+--------+---------+------------+-----------+-------------+-----------------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+
| d7     | t_order | 0          | g_i_buyer | buyer_id    | id, order_id, seller_id, order_snapshot | NULL       | buyer_id         | HASH                | 8                  | buyer_id         | HASH                | 3                  | PUBLIC |
+--------+---------+------------+-----------+-------------+-----------------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+

Anda dapat menjalankan pernyataan berikut untuk menanyakan skema tabel indeks. Tabel indeks berisi kunci utama dari tabel dasar, kunci shard, kolom covering default, dan kolom covering yang ditentukan saat GSI unik didefinisikan. Kolom kunci utama tidak memiliki atribut AUTO_INCREMENT, dan tabel dasar tidak memiliki indeks lokal. Secara default, tabel dibuat untuk GSI unik untuk memastikan bahwa nilai dalam kolom terindeks bersifat unik di seluruh database.

show create table g_i_buyer;
+-----------+--------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                           |
+-----------+--------------------------------------------------------------------------------------------------------+
| g_i_buyer | CREATE TABLE `g_i_buyer` (
  `id` bigint(11) NOT NULL,
  `order_id` varchar(20) DEFAULT NULL,
  `buyer_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  `order_snapshot` longtext,
  PRIMARY KEY (`id`),
  UNIQUE KEY `auto_shard_key_buyer_id` (`buyer_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`buyer_id`) tbpartition by hash(`buyer_id`) tbpartitions 3 |
+-----------+--------------------------------------------------------------------------------------------------------+