全部产品
Search
文档中心

AnalyticDB:Desain skema tabel

更新时间:Dec 02, 2025

Topik ini menjelaskan cara merancang skema tabel AnalyticDB for MySQL untuk mengoptimalkan kinerja. Skema mencakup tipe tabel, kunci distribusi, kunci partisi, kunci primer, dan kunci indeks terkluster.

Pilih tipe tabel

AnalyticDB for MySQL mendukung tabel replikasi dan tabel standar. Saat memilih tipe tabel, pertimbangkan hal-hal berikut:

  • Tabel replikasi menyimpan replika data di setiap node kluster. Disarankan agar volume data dalam setiap tabel replikasi tidak melebihi 20.000 baris.

  • Tabel standar, juga dikenal sebagai tabel partisi, dapat memanfaatkan kemampuan kueri sistem terdistribusi untuk meningkatkan kinerja kueri. Tabel standar mampu menyimpan volume data besar, mulai dari puluhan juta hingga ratusan miliar baris.

Pilih kunci distribusi

Untuk mengimpor data inkremental, tentukan kunci distribusi dan kunci partisi saat membuat tabel standar. Hal ini memungkinkan sinkronisasi data inkremental. Saat membuat tabel, gunakan klausa DISTRIBUTED BY HASH(column_name,...) untuk menentukan kunci distribusi. Tabel kemudian di-shard berdasarkan nilai hash dari bidang column_name. Untuk informasi selengkapnya, lihat CREATE TABLE.

  • Sintaksis

    DISTRIBUTED BY HASH(column_name,...)
  • Catatan Penggunaan

    • Pilih bidang yang nilainya terdistribusi merata sebagai kunci distribusi, seperti ID transaksi, ID perangkat, ID pengguna, atau kolom auto-increment.

      Catatan

      Jangan memilih bidang bertipe DATE, TIME, atau TIMESTAMP sebagai kunci distribusi. Bidang-bidang tersebut dapat menyebabkan kesenjangan data (data skew) saat penulisan data dan menurunkan kinerja tulis. Sebagian besar kueri dibatasi pada rentang waktu tertentu, misalnya hari atau bulan terakhir. Dalam kasus ini, data yang akan dikueri mungkin hanya berada di satu node saja, sehingga Anda tidak dapat memanfaatkan kemampuan pemrosesan semua node dalam database terdistribusi. Disarankan agar bidang bertipe DATE atau TIME digunakan sebagai kunci subpartisi. Untuk informasi selengkapnya, lihat Pilih Kunci Partisi.

    • Untuk mengurangi data shuffle, pilih bidang yang digunakan untuk menggabungkan (join) tabel sebagai kunci distribusi. Misalnya, jika Anda ingin mengkueri riwayat pesanan berdasarkan pelanggan, Anda dapat memilih bidang customer_id sebagai kunci distribusi.

    • Pilih bidang yang sering muncul dalam kondisi kueri sebagai kunci distribusi. Hal ini memungkinkan pemangkasan partisi berdasarkan kunci distribusi.

    • Setiap tabel hanya dapat memiliki satu kunci distribusi. Kunci distribusi dapat terdiri dari satu atau beberapa bidang. Pilih sesedikit mungkin bidang agar kunci distribusi lebih fleksibel untuk berbagai kueri kompleks.

    • Jika Anda tidak menentukan kunci distribusi saat membuat tabel, sistem akan menanganinya sebagai berikut:

      • Jika tabel memiliki kunci primer, AnalyticDB for MySQL menggunakan kunci primer sebagai kunci distribusi default.

      • Jika tabel tidak memiliki kunci primer, AnalyticDB for MySQL menambahkan bidang __adb_auto_id__ dan menggunakannya sebagai kunci primer sekaligus kunci distribusi.

Pilih kunci partisi

Jika satu shard berisi volume data besar setelah Anda menentukan kunci distribusi, Anda dapat mempartisi lebih lanjut shard tersebut menggunakan kunci partisi. Hal ini meningkatkan kinerja akses data. Saat membuat tabel, gunakan klausa PARTITION BY untuk menentukan subpartisi. Data kemudian dibagi sesuai spesifikasi. Untuk informasi selengkapnya, lihat CREATE TABLE.

  • Sintaksis

    • Partisi tabel berdasarkan nilai bidang column_name. Sintaksnya sebagai berikut:

      PARTITION BY VALUE(column_name)
    • Partisi tabel berdasarkan nilai bidang column_name yang dikonversi ke format tanggal %Y%m%d, seperti 20210101. Sintaksnya sebagai berikut:

      PARTITION BY VALUE{(DATE_FORMAT(column_name, '%Y%m%d'))|(FROM_UNIXTIME(column_name, '%Y%m%d'))}
    • Partisi tabel berdasarkan nilai bidang column_name yang dikonversi ke format tanggal %Y%m, seperti 202101. Sintaksnya sebagai berikut:

      PARTITION BY VALUE{(DATE_FORMAT(column_name, '%Y%m'))|(FROM_UNIXTIME(column_name, '%Y%m'))}
    • Partisi tabel berdasarkan nilai bidang column_name yang dikonversi ke format tanggal %Y, seperti 2021. Sintaksnya sebagai berikut:

      PARTITION BY VALUE{(DATE_FORMAT(column_name, '%Y'))|(FROM_UNIXTIME(column_name, '%Y'))}
  • Catatan Penggunaan

    • Saat tabel berisi volume data besar, pemilihan subpartisi sangat penting. Jika tabel tidak memiliki subpartisi atau subpartisinya tidak dipartisi dengan benar, kinerja kluster AnalyticDB for MySQL dapat terpengaruh secara signifikan. Untuk informasi tentang cara mendiagnosis kesesuaian bidang partisi, lihat Diagnostik Kewajaran Bidang Distribusi.

    • Saat ini, partisi hanya didukung berdasarkan tahun, bulan, hari, atau nilai asli. Granularitas partisi yang terlalu besar atau terlalu kecil memengaruhi kinerja kueri dan tulis, bahkan dapat memengaruhi stabilitas kluster AnalyticDB for MySQL.

    • Usahakan agar subpartisi berada dalam keadaan statis sebanyak mungkin. Pembaruan subpartisi secara berkala tidak disarankan. Misalnya, jika Anda memiliki skenario di mana beberapa subpartisi historis diperbarui setiap hari, pertimbangkan apakah bidang subpartisi yang digunakan sudah tepat.

    • Anda dapat menggunakan kata kunci LIFECYCLE N untuk mengelola siklus hidup tabel. Partisi diurutkan, dan partisi yang melebihi N akan difilter.

      Penting

      Jumlah maksimum partisi yang didukung dalam setiap tabel dibatasi. Oleh karena itu, data dalam tabel terpartisi tidak dapat disimpan secara permanen. Untuk informasi selengkapnya tentang batasan partisi, lihat Batasan.

Pilih kunci utama

Kunci primer berfungsi sebagai pengidentifikasi unik untuk setiap catatan. Saat membuat tabel, Anda dapat menggunakan klausa PRIMARY KEY untuk menentukan kunci primer. Untuk informasi selengkapnya, lihat CREATE TABLE.

  • Sintaksis

    PRIMARY KEY (column_name,...)
  • Catatan Penggunaan

    • Hanya tabel yang memiliki kunci primer yang mendukung operasi pembaruan data, seperti DELETE dan UPDATE.

    • Kunci primer tabel AnalyticDB for MySQL dapat berupa satu bidang atau kombinasi beberapa bidang. Untuk mencapai kinerja tabel yang lebih baik, disarankan agar Anda menggunakan bidang numerik sebagai kunci primer dan menggunakan sesedikit mungkin bidang.

    • Kunci primer harus mencakup kunci distribusi dan kunci partisi. Disarankan agar Anda menempatkan kunci distribusi dan kunci partisi di awal kunci primer komposit.

Pilih kunci indeks terkluster

Urutan logis nilai kunci dalam indeks terkluster menentukan urutan fisik baris yang bersesuaian dalam tabel. Saat memilih kunci indeks terkluster, pertimbangkan hal-hal berikut:

  • Setiap tabel hanya mendukung satu indeks terkluster. Untuk informasi tentang cara membuatnya, lihat CREATE TABLE.

  • Gunakan bidang yang selalu disertakan dalam kueri sebagai kunci indeks terkluster. Misalnya, dalam sistem informasi siswa sekolah, setiap siswa hanya perlu melihat nilai akhir mereka sendiri. Dalam kasus ini, Anda dapat menentukan ID siswa sebagai indeks terkluster untuk memastikan lokalisasi data dan meningkatkan kinerja kueri.

  • Indeks terkluster mengurutkan seluruh tabel, yang mengonsumsi sumber daya seperti CPU. Gunakan indeks terkluster secara bijak.

Contoh

Buat tabel bernama customer yang memenuhi persyaratan berikut:

  • Partisi data tabel berdasarkan waktu login pelanggan (kolom login_time), dan konversikan waktu login ke format tanggal %Y%m%d.

  • Simpan hanya data dari 30 partisi terakhir (siklus hidup adalah 30).

  • Distribusikan data berdasarkan ID pelanggan (kolom customer_id).

  • Tetapkan login_time, customer_id, phone_num sebagai kunci primer komposit.

Pernyataan CREATE TABLE-nya sebagai berikut:

CREATE TABLE customer (
customer_id bigint NOT NULL COMMENT 'Customer ID',
customer_name varchar NOT NULL COMMENT 'Customer name',
phone_num bigint NOT NULL COMMENT 'Phone number',
city_name varchar NOT NULL COMMENT 'City',
sex int NOT NULL COMMENT 'Gender',
id_number varchar NOT NULL COMMENT 'ID card number',
home_address varchar NOT NULL COMMENT 'Home address',
office_address varchar NOT NULL COMMENT 'Office address',
age int NOT NULL COMMENT 'Age',
login_time timestamp NOT NULL COMMENT 'Logon time',
PRIMARY KEY (login_time, customer_id, phone_num)
 )
DISTRIBUTED BY HASH(customer_id)
PARTITION BY VALUE(DATE_FORMAT(login_time, '%Y%m%d')) LIFECYCLE 30
COMMENT 'Tabel informasi pelanggan';

Pertanyaan Umum

  • Q: Setelah saya membuat subpartisi, bagaimana cara melihat semua subpartisi tabel beserta statistiknya?

    A: Anda dapat menjalankan pernyataan SQL berikut untuk melihat semua subpartisi tabel beserta statistiknya:

    SELECT partition_id, -- Nama partisi
              row_count, -- Total jumlah baris dalam partisi
              local_data_size, -- Ukuran penyimpanan lokal yang ditempati oleh partisi
              index_size, -- Ukuran indeks partisi
              pk_size, -- Ukuran indeks kunci primer partisi
              remote_data_size -- Ukuran penyimpanan remote yang ditempati oleh partisi
    FROM information_schema.kepler_partitions
    WHERE schema_name = '$DB'
     AND table_name ='$TABLE' 
     AND partition_id > 0;
    Penting

    Partisi dalam data inkremental yang belum dipicu proses compaction tidak ditampilkan. Untuk melihat daftar real-time semua subpartisi, Anda dapat menjalankan pernyataan select distinct $partition_column from $db.$table;.

  • Q: Faktor apa saja yang memengaruhi jumlah shard? Apakah saya bisa mengubah jumlah shard sendiri?

    A: Jumlah shard dihitung secara otomatis berdasarkan spesifikasi awal kluster saat dibuat. Anda tidak dapat mengubah jumlah shard.

  • Q: Apakah perubahan spesifikasi kluster memengaruhi jumlah shard?

    A: Peningkatan atau penurunan spesifikasi kluster tidak memengaruhi jumlah shard.

  • Q: Apakah AnalyticDB for MySQL mendukung perubahan kunci distribusi atau kunci partisi?

    A: Tidak. Untuk mengubah kunci distribusi atau kunci partisi, lihat ALTER TABLE.