全部产品
Search
文档中心

ApsaraDB for SelectDB:Langkah 3: Pelajari poin-poin kunci dalam desain database dan tabel

更新时间:Jul 30, 2025

Desain skema tabel yang baik mendukung fitur-fitur yang kaya serta meningkatkan performa, kemampuan pemeliharaan, dan skalabilitas sistem database secara signifikan. Oleh karena itu, desain database dan skema tabel sangat penting. Topik ini menjelaskan properti tabel yang harus difokuskan saat merancang skema tabel di ApsaraDB for SelectDB. Informasi ini membantu Anda merancang tabel dengan tepat untuk memenuhi kebutuhan bisnis.

Properti tabel penting

Saat menyimpan data bisnis Anda di ApsaraDB for SelectDB, penting untuk merancang properti tabel berdasarkan kebutuhan bisnis Anda. Ini membantu Anda membuat skema tabel yang berperforma tinggi dan mudah dipelihara. Tabel berikut menggambarkan properti tabel penting dari ApsaraDB for SelectDB.

Properti tabel

Diperlukan

Deskripsi

Referensi

Model data

Ya

Berbagai model data cocok untuk skenario bisnis yang berbeda: Model Unique mendukung batasan unik pada kunci utama dan digunakan untuk memenuhi kebutuhan pembaruan data yang fleksibel dan efisien.

Model Duplicate menggunakan mode penulisan data tambahan dan cocok untuk analisis performa tinggi pada data rinci.

Model Aggregate mendukung pra-agregasi data dan cocok untuk skenario agregasi dan statistik data.

Model data

Tablet

Ya

Tablet digunakan untuk mendistribusikan data ke node yang berbeda dalam kluster untuk mengelola dan menanyakan sejumlah besar data dengan memanfaatkan kemampuan sistem terdistribusi.

Partisi

Tidak

Pembagian partisi memungkinkan Anda membagi tabel mentah menjadi beberapa tabel anak berdasarkan bidang tertentu, seperti waktu dan wilayah. Pembagian partisi mempermudah pengelolaan data dan query serta mempercepat query.

Indeks

Tidak

Anda dapat dengan cepat menyaring atau menemukan data berdasarkan indeks. Hal ini sangat meningkatkan performa query.

Indeks

Model data

Anda dapat memilih model data yang sesuai berdasarkan persyaratan fungsional dan performa dari skenario analisis data Anda. Berbagai model data cocok untuk skenario bisnis yang berbeda. Bagian ini menjelaskan model data untuk membantu Anda memahami dan memilih model data berdasarkan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat Model Data.

Dasar-dasar

Di ApsaraDB for SelectDB, data diorganisasikan dan dikelola dalam bentuk tabel di lapisan logis. Setiap tabel terdiri dari baris dan kolom. Baris menunjukkan satu entri data dalam tabel, sedangkan kolom digunakan untuk menggambarkan bidang dalam baris tersebut.

Kolom dapat dibagi menjadi jenis-jenis berikut:

  • Kolom Kunci: Kolom yang dimodifikasi oleh kata kunci UNIQUE KEY, AGGREGATE KEY, dan DUPLICATE KEY dalam pernyataan CREATE TABLE adalah kolom kunci.

  • Kolom Nilai: Semua kolom lainnya adalah kolom nilai.

Pilih model

Di ApsaraDB for SelectDB, tiga jenis model data tersedia untuk tabel: Unique, Duplicate, dan Aggregate.

Penting
  • Model data ditentukan selama pembuatan tabel dan tidak dapat diubah.

  • Jika tidak ada model data yang ditentukan selama pembuatan tabel, model Duplicate digunakan secara default dan tiga kolom pertama secara otomatis dipilih sebagai kolom kunci.

  • Dalam model Unique, Duplicate, dan Aggregate, data diurutkan berdasarkan kolom kunci.

Model Data

Karakteristik

Skenario

Kelemahan

Unique

Nilai untuk kolom kunci di setiap baris bersifat unik.

Jika kolom kunci memiliki nilai yang sama di beberapa baris, baris yang ditulis ke tabel nanti akan menimpa baris sebelumnya.

Model ini cocok untuk skenario yang memerlukan kunci utama unik atau pembaruan yang efisien, seperti analisis pesanan e-commerce dan data atribut pengguna.

  • Materialized view sinkron hanya dapat mengubah urutan kolom tetapi tidak dapat mengagregasi data.

Duplicate

Nilai untuk kolom kunci di beberapa baris bisa sama.

Beberapa baris dengan nilai yang sama untuk kolom kunci dapat disimpan dalam sistem pada saat yang sama.

Model ini memiliki efisiensi penulisan dan query data yang tinggi, cocok untuk skenario di mana semua catatan data mentah disimpan, seperti analisis log dan analisis tagihan.

  • Anda tidak dapat memperbarui data yang sudah ada.

Aggregate

Nilai untuk kolom kunci di setiap baris bersifat unik.

Jika beberapa baris memiliki nilai yang sama untuk kolom kunci, kolom nilai dalam baris tersebut di-pra-aggregasi berdasarkan tipe agregasi yang ditentukan selama pembuatan tabel.

Mirip dengan model Cube dari gudang data tradisional, model Aggregate cocok untuk skenario statistik agregat yang meningkatkan performa query melalui pra-agregasi, seperti analisis lalu lintas situs web dan laporan kustom.

  • Model ini hanya memberikan dukungan terbatas untuk pernyataan COUNT(*).

  • Tipe agregasi untuk kolom nilai bersifat tetap.

Gunakan model

Gunakan model Unique

Dalam model Unique, jika kolom kunci memiliki nilai yang sama di beberapa baris, baris yang ditulis ke tabel nanti akan menimpa baris sebelumnya. Model Unique menyediakan dua metode implementasi: Merge on Read (MoR) dan Merge on Write (MoW).

Metode MoW sudah matang dan stabil serta memberikan performa query yang sangat baik. Oleh karena itu, kami merekomendasikan Anda menggunakan metode MoW dalam model Unique. Contoh berikut menggambarkan cara menggunakan metode MoW untuk mengimplementasikan model Unique. Untuk informasi lebih lanjut tentang metode MoR, lihat bagian MoR dari topik "Model Data".

Catatan penggunaan

Jika Anda memilih model Unique dan ingin menggunakan metode MoW, perhatikan item-item berikut saat Anda membuat tabel:

  • Gunakan kata kunci UNIQUE KEY untuk menentukan bidang unik sebagai kunci utama.

  • Aktifkan MoW di bagian PROPERTIES.

    "enable_unique_key_merge_on_write" = "true"
Contoh

Kode sampel berikut menunjukkan pernyataan SQL untuk membuat tabel orders. Dalam contoh ini, model Unique dipilih untuk tabel orders, bidang order_id dan order_time digunakan sebagai kunci utama komposit, dan metode MoW diaktifkan.

CREATE TABLE IF NOT EXISTS orders
(
    `order_id` LARGEINT NOT NULL COMMENT "ID pesanan.",
    `order_time` DATETIME NOT NULL COMMENT "Waktu pesanan.",
    `customer_id` LARGEINT NOT NULL COMMENT "ID pengguna.",
    `total_amount` DOUBLE COMMENT "Jumlah total pesanan.",
    `status` VARCHAR(20) COMMENT "Status pesanan.",
    `payment_method` VARCHAR(20) COMMENT "Metode pembayaran.",
    `shipping_method` VARCHAR(20) COMMENT "Metode pengiriman.",
    `customer_city` VARCHAR(20) COMMENT "Kota tempat pengguna tinggal.",
    `customer_address` VARCHAR(500) COMMENT "Alamat pengguna."
)
UNIQUE KEY(`order_id`, `order_time`)
PARTITION BY RANGE(`order_time`) ()
DISTRIBUTED BY HASH(`order_id`)
PROPERTIES (
    "enable_unique_key_merge_on_write" = "true",
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-7",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.create_history_partition" = "true",
    "dynamic_partition.buckets" = "16"
);

Gunakan model Duplicate

Dalam model Duplicate, beberapa baris dengan nilai yang sama untuk kolom kunci disimpan dalam sistem pada saat yang sama. Model ini tidak mendukung pra-agregasi atau memerlukan kunci utama unik.

Misalnya, Anda dapat menggunakan model ini untuk mencatat dan menganalisis data log yang dihasilkan oleh sistem bisnis dan mengurutkan data berdasarkan waktu log, tipe log, dan kode kesalahan. Kode sampel berikut menunjukkan pernyataan SQL untuk membuat tabel log. Dalam contoh ini, model Duplicate dipilih untuk tabel log, dan data diurutkan berdasarkan bidang log_time, log_type, dan error_code.

CREATE TABLE IF NOT EXISTS log
(
    `log_time` DATETIME NOT NULL COMMENT "Waktu ketika log dihasilkan.",
    `log_type` INT NOT NULL COMMENT "Tipe log.",
    `error_code` INT COMMENT "Kode kesalahan.",
    `error_msg` VARCHAR(1024) COMMENT "Pesan kesalahan.",
    `op_id` BIGINT COMMENT "ID pemilik.",
    `op_time` DATETIME COMMENT "Waktu ketika kesalahan ditangani."
)
DUPLICATE KEY(`log_time`, `log_type`, `error_code`)
PARTITION BY RANGE(`log_time`) ()
DISTRIBUTED BY HASH(`log_type`)
PROPERTIES (
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-7",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.create_history_partition" = "true",
    "dynamic_partition.buckets" = "16"
);

Gunakan model Aggregate

Catatan penggunaan

Dalam model Aggregate, jika beberapa baris memiliki nilai yang sama untuk kolom kunci, kolom nilai dalam baris tersebut di-pra-aggregasi berdasarkan tipe agregasi yang ditentukan selama pembuatan tabel. Anda harus memperhatikan item-item berikut saat membuat tabel model Aggregate:

  • Gunakan kata kunci AGGREGATE KEY untuk menentukan satu atau lebih kolom kunci. Baris dengan nilai yang sama untuk kolom kunci di-aggregasi.

  • Tentukan tipe agregasi untuk kolom nilai. Tabel berikut menggambarkan tipe-tipe agregasi.

    Tipe agregasi

    Deskripsi

    SUM

    Menghitung jumlah nilai dalam beberapa baris. Tipe ini berlaku untuk nilai numerik.

    MIN

    Menghitung nilai minimum. Tipe ini berlaku untuk nilai numerik.

    MAX

    Menghitung nilai maksimum. Tipe ini berlaku untuk nilai numerik.

    REPLACE

    Mengganti nilai sebelumnya dengan nilai yang baru diimpor. Untuk baris yang berisi data yang sama dalam kolom dimensi, nilai dalam kolom metrik diganti dengan nilai yang baru diimpor berdasarkan urutan nilai diimpor.

    REPLACE_IF_NOT_NULL

    Mengganti nilai kecuali nilai null dengan nilai yang baru diimpor. Berbeda dengan tipe REPLACE, tipe ini tidak mengganti nilai null. Saat menggunakan tipe ini, Anda harus menentukan nilai null alih-alih string kosong sebagai nilai default untuk bidang. Jika Anda menentukan string kosong sebagai nilai default untuk bidang, tipe ini mengganti string kosong dengan string lainnya.

    HLL_UNION

    Mengagregasi kolom tipe HyperLogLog (HLL) menggunakan algoritma HLL.

    BITMAP_UNION

    Mengagregasi kolom tipe BITMAP, yang melakukan agregasi gabungan bitmap.

Contoh

Misalnya, Anda dapat menggunakan model Aggregate untuk melakukan analisis statistik pada perilaku pengguna dan mencatat informasi berikut: waktu kunjungan terakhir, total konsumsi, waktu tinggal maksimum, dan waktu tinggal minimum. Kode sampel berikut menunjukkan pernyataan SQL untuk membuat tabel user_behavior. Dalam contoh ini, kolom nilai di-pra-aggregasi jika kolom kunci berikut memiliki nilai yang sama di beberapa baris: user_id, date, city, age, dan sex. Data di-aggregasi berdasarkan aturan berikut:

  • Waktu kunjungan terakhir pengguna: Gunakan nilai maksimum dari bidang last_visit_date.

  • Total konsumsi: Hitung jumlah beberapa catatan data.

  • Waktu tinggal maksimum: Gunakan nilai maksimum dari bidang max_dwell_time.

  • Waktu tinggal minimum: Gunakan nilai minimum dari bidang min_dwell_time.

CREATE TABLE IF NOT EXISTS user_behavior
(
    `user_id` LARGEINT NOT NULL COMMENT "ID pengguna.",
    `date` DATE NOT NULL COMMENT "Tanggal ketika data ditulis ke tabel.",
    `city` VARCHAR(20) COMMENT "Kota tempat pengguna tinggal.",
    `age` SMALLINT COMMENT "Usia pengguna.",
    `sex` TINYINT COMMENT "Jenis kelamin pengguna.",
    `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "Terakhir kali pengguna berkunjung.",
    `cost` BIGINT SUM DEFAULT "0" COMMENT "Jumlah uang yang dibelanjakan pengguna.",
    `max_dwell_time` INT MAX DEFAULT "0" COMMENT "Waktu tinggal maksimum pengguna.",
    `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "Waktu tinggal minimum pengguna."
)
AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`)
PARTITION BY RANGE(`date`) ()
DISTRIBUTED BY HASH(`user_id`)
PROPERTIES (
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-7",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.create_history_partition" = "true",
    "dynamic_partition.buckets" = "16"
);

Pembagian data

ApsaraDB for SelectDB mendukung dua lapis pembagian data, seperti yang ditunjukkan pada gambar berikut. Tabel secara logis dibagi menjadi partisi di lapisan pertama. Partisi adalah unit terkecil untuk pengelolaan data. Tabel secara fisik dibagi menjadi tablet di lapisan kedua. Tablet adalah unit terkecil untuk operasi data, seperti distribusi data dan migrasi data.

Hubungan antara partisi dan tablet
  • Sebuah tablet hanya milik satu partisi, sedangkan sebuah partisi mengandung beberapa tablet.

  • Jika pembagian partisi diaktifkan saat Anda membuat tabel, tabel tersebut dibagi menjadi partisi berdasarkan aturan partisi dan kemudian dibagi menjadi tablet berdasarkan aturan tableting. Jika pembagian partisi tidak diaktifkan, tabel langsung dibagi menjadi tablet berdasarkan aturan tableting.

  • Saat penulisan data, data pertama kali ditulis ke partisi, dan kemudian ditulis ke tablet yang berbeda dalam partisi berdasarkan aturan tableting. Tableting adalah pembagian lebih lanjut dari data yang telah dipartisi untuk mendistribusikan data secara lebih merata dan meningkatkan efisiensi query.

Partisi

Dalam mesin penyimpanan ApsaraDB for SelectDB, partisi adalah metode pengorganisasian data yang membagi data dalam tabel menjadi beberapa bagian independen berdasarkan aturan kustom. Partisi mengimplementasikan pembagian logis data, meningkatkan efisiensi query dan membuat pengelolaan data lebih fleksibel dan nyaman. Bagian ini menjelaskan partisi untuk membantu Anda memahami dan memilih mode partisi berdasarkan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat bagian Pembagian Partisi dari topik "Pembagian Partisi dan Bucketing" dan topik Pembagian Partisi Dinamis.

Pilih mode partisi

ApsaraDB for SelectDB mendukung dua mode partisi: partisi rentang dan partisi daftar. ApsaraDB for SelectDB juga menyediakan fitur partisi dinamis yang mudah digunakan untuk mengimplementasikan manajemen partisi otomatis. Mode partisi cocok untuk skenario bisnis yang berbeda.

Mode Partisi

Tipe Data Kolom yang Didukung

Metode yang Digunakan untuk Menentukan Informasi Partisi

Skenario

Range

DATE, DATETIME, TINYINT, SMALLINT, INT, BIGINT, dan LARGEINT

Empat metode berikut didukung:

  1. VALUES [...): membuat partisi dengan rentang tertutup di sisi kiri dan terbuka di sisi kanan.

  2. VALUES LESS THAN (...): membuat partisi dengan hanya menetapkan batas atas. Batas bawahnya diambil dari batas atas partisi sebelumnya.

  3. BATCH RANGE: membuat beberapa partisi tipe numerik dan waktu. Partisi-partisi ini memiliki rentang tertutup di sisi kiri dan terbuka di sisi kanan serta memiliki langkah yang telah ditentukan sebelumnya.

  4. MULTI RANGE: membuat beberapa partisi dengan rentang tertutup di sisi kiri dan terbuka di sisi kanan.

Partisi rentang cocok untuk mengelola rentang pembagian data. Skenario tipikal untuk metode ini adalah partisi berbasis waktu.

List

BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, dan VARCHAR

VALUES IN (...): menentukan nilai enumerasi yang terkandung dalam setiap partisi.

Partisi daftar cocok untuk pengelolaan data berdasarkan tipe yang ada atau karakteristik tetap. Kolom kunci partisi biasanya memiliki nilai enumerasi. Misalnya, Anda dapat membagi dan mengelola data berdasarkan wilayah tempat pengguna tinggal.

Catatan penggunaan

  • Di ApsaraDB for SelectDB, tabel diklasifikasikan menjadi tabel partisi dan tabel non-partisi. Anda dapat menentukan apakah akan mengaktifkan partisi saat membuat tabel. Properti ini bersifat opsional dan tidak dapat diubah setelah ditentukan. Secara spesifik, Anda dapat membuat atau menghapus partisi untuk tabel partisi. Anda tidak dapat membuat atau menghapus partisi untuk tabel non-partisi.

  • Anda dapat menentukan satu atau lebih kolom sebagai kolom kunci partisi. Kolom kunci partisi harus merupakan kolom kunci.

  • Anda harus mengapit nilai kunci partisi dalam tanda kutip ganda (") terlepas dari tipe data kolom kunci partisi.

  • Secara teoritis, jumlah partisi tidak terbatas.

  • Saat membuat partisi, pastikan bahwa rentang partisi tidak tumpang tindih.

Gunakan partisi

Gunakan partisi rentang

Partisi rentang adalah metode partisi yang paling umum digunakan untuk mengelola data berdasarkan rentang bidang. Dalam skenario tipikal, sejumlah besar data deret waktu dipartisi berdasarkan waktu untuk mempermudah pengelolaan dan mengoptimalkan query.

Tujuan akhir dari partisi dan tableting adalah untuk membagi data secara masuk akal. Patuhi standar berikut saat menentukan aturan partisi:

  • Jumlah data setiap tablet harus berada dalam rentang 1 GB hingga 10 GB.

  • Granularitas partisi harus ditentukan berdasarkan jumlah data yang ingin Anda kelola. Misalnya, jika Anda ingin menghapus data log historis berdasarkan hari, granularitas partisi harian adalah sesuai.

Kode sampel berikut menunjukkan cara membuat tabel partisi, data di mana difilter berdasarkan rentang waktu dan data log historis dihapus berdasarkan waktu. Dalam contoh ini, bidang log_time digunakan sebagai kolom kunci partisi.

CREATE TABLE IF NOT EXISTS log
(
 `log_time` DATETIME NOT NULL COMMENT "Waktu ketika log dihasilkan.",
 `log_type` INT NOT NULL COMMENT "Tipe log.",
 `error_code` INT COMMENT "Kode kesalahan.",
 `error_msg` VARCHAR(1024) COMMENT "Pesan kesalahan.",
 `op_id` BIGINT COMMENT "ID pemilik.",
 `op_time` DATETIME COMMENT "Waktu ketika kesalahan ditangani."
)
DUPLICATE KEY(`log_time`, `log_type`, `error_code`)
PARTITION BY RANGE(`log_time`)
(
 PARTITION `p20240201` VALUES [("2024-02-01"), ("2024-02-02")),
 PARTITION `p20240202` VALUES [("2024-02-02"), ("2024-02-03")),
 PARTITION `p20240203` VALUES [("2024-02-03"), ("2024-02-04"))
)
DISTRIBUTED BY HASH(`log_type`)
PROPERTIES ();

Setelah tabel dibuat, Anda dapat menjalankan pernyataan SQL berikut untuk melihat informasi partisi tabel:

SHOW partitions FROM log;
p20240201: [("2024-02-01"), ("2024-02-02"))
p20240202: [("2024-02-02"), ("2024-02-03"))
p20240203: [("2024-02-03"), ("2024-02-04"))

Saat mengeksekusi pernyataan berikut untuk mengkueri data, partisi p20240202: [("2024-02-02"), ("2024-02-03")) diakses. Sistem tidak memindai data di dua partisi lainnya, sehingga mempercepat proses kueri.

SELECT * FROM orders WHERE order_time = '2024-02-02';

Gunakan partisi daftar

Partisi daftar membagi dan mengelola data berdasarkan nilai enumerasi kolom kunci partisi. Saat menanyakan data dari tabel partisi daftar, Anda dapat memangkas partisi sesuai dengan kondisi filter untuk meningkatkan performa query.

Anda dapat memilih kolom kunci partisi daftar berdasarkan bidang yang sering digunakan untuk mengelola data bisnis. Pastikan data didistribusikan secara merata ke partisi guna mencegah kesenjangan data yang signifikan.

Sebagai contoh, dalam skenario e-commerce terdapat sejumlah besar data pesanan. Dalam beberapa kasus, Anda mungkin ingin menanyakan dan menganalisis data pesanan berdasarkan kota tempat pengguna tinggal. Untuk mempermudah pengelolaan dan query data, Anda dapat menetapkan bidang customer_city sebagai kolom kunci partisi. Pada contoh ini, data pesanan didistribusikan di kota-kota berikut:

  • Beijing, Shanghai, dan Hong Kong, Tiongkok: 6 GB

  • New York dan San Francisco: 5 GB

  • Tokyo: 5 GB

Kode sampel berikut menunjukkan cara membuat tabel partisi daftar untuk data pesanan:

CREATE TABLE IF NOT EXISTS orders
(
    `order_id` LARGEINT NOT NULL COMMENT "ID pesanan.",
    `order_time` DATETIME NOT NULL COMMENT "Waktu pesanan.",
    `customer_city` VARCHAR(20) COMMENT "Kota tempat pengguna tinggal.",
    `customer_id` LARGEINT NOT NULL COMMENT "ID pengguna.",
    `total_amount` DOUBLE COMMENT "Jumlah total pesanan.",
    `status` VARCHAR(20) COMMENT "Status pesanan.",
    `payment_method` VARCHAR(20) COMMENT "Metode pembayaran.",
    `shipping_method` VARCHAR(20) COMMENT "Metode pengiriman.",
    `customer_address` VARCHAR(500) COMMENT "Alamat pengguna."
)
UNIQUE KEY(`order_id`, `order_time`, `customer_city`)
PARTITION BY LIST(`customer_city`)
(
    PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),
    PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),
    PARTITION `p_jp` VALUES IN ("Tokyo")
)
DISTRIBUTED BY HASH(`order_id`) BUCKETS 16
PROPERTIES (
    "enable_unique_key_merge_on_write" = "true"
);

Setelah tabel dibuat, Anda dapat menjalankan pernyataan SQL berikut untuk melihat informasi partisi tabel. Tiga partisi secara otomatis dibuat untuk tabel tersebut:

SHOW partitions FROM orders;
p_cn: ("Beijing", "Shanghai", "Hong Kong")
p_usa: ("New York", "San Francisco")
p_jp: ("Tokyo")

Saat menjalankan pernyataan berikut untuk menanyakan data, partisi p_jp: ("Tokyo") tercapai. Sistem tidak memindai data di dua partisi lainnya, sehingga mempercepat query data.

SELECT * FROM orders WHERE customer_city = 'Tokyo';

Gunakan partisi dinamis

Dalam lingkungan produksi, tabel data dapat memiliki sejumlah besar partisi, yang mengakibatkan beban kerja manual yang signifikan dalam pengelolaan partisi dan menambah biaya pemeliharaan bagi administrator basis data. ApsaraDB for SelectDB memungkinkan Anda mengonfigurasi aturan partisi dinamis saat pembuatan tabel untuk mengimplementasikan manajemen partisi secara otomatis.

Sebagai contoh, dalam skenario e-commerce, Anda sering perlu mengakses data dalam tabel informasi pesanan berdasarkan rentang waktu serta mengekspor pesanan historis untuk arsip. Anda dapat menetapkan bidang order_time sebagai kolom kunci partisi dan mengaktifkan partisi dinamis di bagian PROPERTIES. Kode sampel berikut menunjukkan cara membuat tabel dengan partisi dinamis. Pada contoh ini, parameter dynamic_partition.time_unit, dynamic_partition.start, dan dynamic_partition.end ditentukan di bagian PROPERTIES untuk mempartisi data berdasarkan hari, hanya menyimpan partisi 180 hari terakhir, serta membuat partisi untuk tiga hari ke depan secara otomatis.

Penting

Tanda kurung () di akhir pernyataan PARTITION BY RANGE('order_time') () bukan merupakan kesalahan sintaksis. Tanda kurung tersebut diperlukan jika Anda ingin menggunakan partisi dinamis.

CREATE TABLE IF NOT EXISTS orders
(
    `order_id` LARGEINT NOT NULL COMMENT "ID pesanan.",
    `order_time` DATETIME NOT NULL COMMENT "Waktu pesanan.",
    `customer_id` LARGEINT NOT NULL COMMENT "ID pengguna.",
    `total_amount` DOUBLE COMMENT "Jumlah total pesanan.",
    `status` VARCHAR(20) COMMENT "Status pesanan.",
    `payment_method` VARCHAR(20) COMMENT "Metode pembayaran.",
    `shipping_method` VARCHAR(20) COMMENT "Metode pengiriman.",
    `customer_city` VARCHAR(20) COMMENT "Kota tempat pengguna tinggal.",
    `customer_address` VARCHAR(500) COMMENT "Alamat pengguna."
)
UNIQUE KEY(`order_id`, `order_time`)
PARTITION BY RANGE(`order_time`) ()
DISTRIBUTED BY HASH(`order_id`)
PROPERTIES (
    "enable_unique_key_merge_on_write" = "true",
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-180",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.create_history_partition" = "true",
    "dynamic_partition.buckets" = "16"
);

Jika tabel diperkirakan memiliki sejumlah besar partisi, kami sangat merekomendasikan Anda mempelajari partisi dinamis. Untuk informasi lebih lanjut, lihat Partisi dinamis.

Tablet

Mesin penyimpanan ApsaraDB for SelectDB membagi data menjadi tablet yang berbeda berdasarkan nilai hash kolom yang ditentukan. Tablet dikelola oleh node yang berbeda dalam kluster. Kemampuan sistem terdistribusi digunakan untuk mengelola dan menanyakan sejumlah besar data. Saat Anda membuat tabel, gunakan klausa DISTRIBUTED BY HASH('<Tablet key column>') BUCKETS <Number of tablets> untuk mengonfigurasi tablet. Untuk informasi lebih lanjut, lihat bagian Bucketing dari topik "Pembagian Partisi dan Bucketing".

Catatan penggunaan

  • Jika partisi diaktifkan, klausa DISTRIBUTED... menjelaskan aturan untuk membagi data di setiap partisi. Jika partisi tidak diaktifkan, klausa ini menjelaskan aturan untuk membagi data penuh tabel.

  • Anda dapat menentukan beberapa kolom sebagai kolom kunci tablet.

    Dalam model Aggregate dan Unique, kolom kunci tablet harus merupakan kolom kunci. Dalam model Duplicate, kolom kunci tablet bisa berupa kolom kunci atau nilai.

    Kami merekomendasikan Anda memilih kolom dengan kardinalitas tinggi sebagai kolom kunci tablet untuk mendistribusikan data dan mencegah kesenjangan data.

  • Secara teoritis, jumlah tablet tidak terbatas.

    Secara teoritis, jumlah data yang dapat disimpan dalam satu tablet tidak terbatas. Namun, kami merekomendasikan Anda menyimpan 1 GB hingga 10 GB data dalam satu tablet.

    Jika setiap tablet berisi sejumlah kecil data, jumlah tablet menjadi besar, yang mengakibatkan beban kerja manajemen metadata yang lebih besar.

    Jika setiap tablet berisi sejumlah besar data, migrasi replika terpengaruh secara negatif dan kluster terdistribusi tidak dapat dimanfaatkan sepenuhnya. Ini juga meningkatkan biaya untuk mencoba kembali operasi gagal seperti perubahan skema atau pembuatan indeks. Operasi ini dilakukan per tablet.

Pilih kolom kunci tablet

Kolom kunci tablet yang Anda pilih saat merancang tabel memiliki dampak penting pada performa query dan konkurensi query. Tabel berikut menggambarkan aturan untuk memilih kolom kunci tablet. Jika bisnis Anda memiliki beberapa persyaratan query, beberapa jenis kolom kunci tablet mungkin diperlukan. Dalam hal ini, prioritaskan pemilihan kolom berdasarkan persyaratan query utama.

Aturan

Manfaat

Pilih kolom dengan kardinalitas tinggi atau kombinasi beberapa kolom untuk memastikan distribusi data yang merata.

Data didistribusikan secara lebih merata di seluruh node kluster, sehingga sumber daya sistem terdistribusi dapat dimanfaatkan sepenuhnya. Hal ini meningkatkan performa query, terutama untuk query dengan efek penyaringan buruk yang memerlukan pemindaian sejumlah besar data.

Pilih kolom yang sering digunakan dalam kondisi filter untuk mencapai keseimbangan optimal antara pemangkasan data dan percepatan query.

Data dengan nilai identik pada kolom kunci tablet di-aggregasi. Pemangkasan data menjadi lebih cepat dan konkurensi query meningkat untuk query titik yang menggunakan kolom kunci tablet tertentu sebagai kondisi filter.

Catatan

Query titik biasanya digunakan untuk mengambil sejumlah kecil data dari database berdasarkan kondisi tertentu. Metode ini secara tepat menemukan dan mengambil data spesifik yang memenuhi kondisi tersebut, seperti penyaringan berdasarkan kunci utama dan kolom dengan kardinalitas tinggi.

Contoh

Dalam skenario e-commerce, Anda perlu menanyakan data berdasarkan pesanan dalam banyak kasus. Terkadang, Anda perlu melakukan analisis statistik berdasarkan data pesanan lengkap. Dalam hal ini, Anda dapat memilih kolom order_id dengan kardinalitas tinggi dari kolom kunci tabel informasi pesanan sebagai kolom kunci tablet untuk memastikan bahwa data didistribusikan secara merata ke beberapa tablet. Data dalam kolom order_id di-aggregasi untuk memberikan performa yang diperlukan oleh query-query sebelumnya. Kode sampel berikut menunjukkan cara membuat tabel untuk skenario seperti itu:

CREATE TABLE IF NOT EXISTS orders
(
    `order_id` LARGEINT NOT NULL COMMENT "ID pesanan.",
    `order_time` DATETIME NOT NULL COMMENT "Waktu pesanan.",
    `customer_id` LARGEINT NOT NULL COMMENT "ID pengguna.",
    `total_amount` DOUBLE COMMENT "Jumlah total pesanan.",
    `status` VARCHAR(20) COMMENT "Status pesanan.",
    `payment_method` VARCHAR(20) COMMENT "Metode pembayaran.",
    `shipping_method` VARCHAR(20) COMMENT "Metode pengiriman.",
    `customer_city` VARCHAR(20) COMMENT "Kota tempat pengguna tinggal.",
    `customer_address` VARCHAR(500) COMMENT "Alamat pengguna."
)
UNIQUE KEY(`order_id`, `order_time`)
PARTITION BY RANGE(`order_time`) ()
DISTRIBUTED BY HASH(`order_id`)
PROPERTIES (
    "enable_unique_key_merge_on_write" = "true",
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-7",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.create_history_partition" = "true",
    "dynamic_partition.buckets" = "16"
);

Indeks

Indeks memainkan peran penting dalam desain database, di mana indeks yang tepat dapat secara signifikan meningkatkan performa query. Namun, indeks juga dapat memakan ruang penyimpanan tambahan dan menurunkan performa penulisan. Bagian ini memberikan gambaran singkat tentang jenis indeks yang umum digunakan untuk membantu Anda memahami dan memilih indeks sesuai dengan kebutuhan bisnis Anda. Untuk informasi lebih lanjut, lihat Percepatan berbasis indeks.

Aturan untuk membuat indeks

  • Dalam banyak kasus, kunci tertentu digunakan untuk membuat indeks awalan secara otomatis, memberikan hasil penyaringan yang optimal. Namun, tabel hanya dapat memiliki satu indeks awalan. Oleh karena itu, disarankan untuk memilih kunci yang paling sering digunakan sebagai kondisi filter.

  • Untuk kebutuhan percepatan penyaringan lainnya, indeks terbalik lebih direkomendasikan. Indeks terbalik memiliki cakupan aplikasi yang luas dan mendukung kombinasi beberapa kolom sebagai kondisi filter. Anda dapat menggunakan indeks Bloom filter ringan dan indeks Bloom filter NGram untuk mencocokkan string dalam query ekuivalen dan LIKE.

Pilih indeks

Di ApsaraDB for SelectDB, tabel dapat menggunakan indeks bawaan atau indeks kustom. Indeks bawaan dibuat secara otomatis oleh sistem, sedangkan indeks kustom dapat dibuat saat atau setelah pembuatan tabel sesuai dengan kebutuhan bisnis Anda.

Metode

Tipe indeks

Tipe query yang didukung

Tipe query yang tidak didukung

Keuntungan

Kerugian

Bawaan

Indeks awalan

  • Query ekuivalen dan non-ekuivalen

  • Query rentang

  • Query LIKE

  • Query pencocokan berdasarkan kata kunci atau frase

Indeks awalan menempati ruang penyimpanan yang relatif kecil dan dapat sepenuhnya di-cache dalam memori. Ini memungkinkan sistem untuk dengan cepat menemukan blok data dan secara signifikan meningkatkan efisiensi query.

Sebuah tabel hanya dapat memiliki satu indeks awalan.

Kustom

Indeks terbalik (direkomendasikan)

  • Query ekuivalen, non-ekuivalen, dan rentang untuk string, angka, serta tanggal dan waktu

  • Query pencocokan string berdasarkan kata kunci atau frase

  • Pencarian teks penuh

Tidak ada

Berbagai tipe query didukung. Anda dapat membuat indeks saat atau setelah Anda membuat tabel berdasarkan kebutuhan bisnis Anda. Anda juga dapat menghapus indeks.

Indeks ini menempati sejumlah besar ruang penyimpanan.

Indeks Bloom filter

Query ekuivalen

  • Query non-ekuivalen

  • Query rentang

  • Query LIKE

  • Query pencocokan berdasarkan kata kunci atau frase

Indeks ini menempati sumber daya komputasi dan penyimpanan yang kecil.

Hanya query ekuivalen yang mendukung indeks Bloom filter.

Indeks Bloom filter NGram

Query LIKE

  • Query ekuivalen dan non-ekuivalen

  • Query rentang

  • Query pencocokan berdasarkan kata kunci atau frase

Indeks ini mempercepat query LIKE dan menempati sumber daya komputasi dan penyimpanan yang kecil.

Indeks Bloom filter NGram hanya dapat mempercepat query LIKE.

Gunakan indeks

Gunakan indeks terbalik

ApsaraDB for SelectDB mendukung indeks terbalik. Anda dapat menggunakan indeks terbalik untuk melakukan pencarian teks penuh pada data tipe TEXT dan menjalankan query ekuivalen atau rentang pada bidang biasa. Dengan cara ini, Anda dapat dengan cepat mengambil data yang memenuhi kondisi tertentu dari sejumlah besar data. Bagian ini menjelaskan cara membuat indeks terbalik. Untuk informasi lebih lanjut, lihat Indeks Terbalik.

Buat indeks terbalik saat Anda membuat tabel

Dalam skenario e-commerce, Anda sering perlu menanyakan informasi pesanan berdasarkan kata kunci seperti ID pengguna dan alamat pengguna. Dalam hal ini, Anda dapat membuat indeks terbalik pada bidang customer_id dan customer_address untuk mempercepat query. Kode sampel berikut menunjukkan cara membuat tabel untuk skenario seperti itu:

CREATE TABLE IF NOT EXISTS orders
(
    `order_id` LARGEINT NOT NULL COMMENT "ID pesanan.",
    `order_time` DATETIME NOT NULL COMMENT "Waktu pesanan.",
    `customer_id` LARGEINT NOT NULL COMMENT "ID pengguna.",
    `total_amount` DOUBLE COMMENT "Jumlah total pesanan.",
    `status` VARCHAR(20) COMMENT "Status pesanan.",
    `payment_method` VARCHAR(20) COMMENT "Metode pembayaran.",
    `shipping_method` VARCHAR(20) COMMENT "Metode pengiriman.",
    `customer_city` VARCHAR(20) COMMENT "Kota tempat pengguna tinggal.",
    `customer_address` VARCHAR(500) COMMENT "Alamat pengguna.",
    INDEX idx_customer_id (`customer_id`) USING INVERTED,
    INDEX idx_customer_address (`customer_address`) USING INVERTED PROPERTIES("parser" = "chinese")
)
UNIQUE KEY(`order_id`, `order_time`)
PARTITION BY RANGE(`order_time`) ()
DISTRIBUTED BY HASH(`order_id`)
PROPERTIES (
    "enable_unique_key_merge_on_write" = "true",
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-7",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
    "dynamic_partition.create_history_partition" = "true",
    "dynamic_partition.buckets" = "16"
);
Buat indeks terbalik pada kolom dalam tabel yang sudah ada

Dalam skenario e-commerce, Anda sering perlu menanyakan informasi pesanan berdasarkan ID pengguna. Namun, tidak ada indeks terbalik yang dibuat pada bidang customer_id saat Anda membuat tabel orders. Dalam hal ini, Anda dapat menjalankan pernyataan berikut untuk menambahkan indeks ke tabel:

ALTER TABLE orders ADD INDEX idx_customer_id (`customer_id`) USING INVERTED;

Gunakan indeks awalan

Indeks awalan dibuat pada satu atau lebih kolom kunci dalam data dasar yang diurutkan berdasarkan kolom kunci. Pada dasarnya, pengindeksan awalan adalah pencarian biner berdasarkan fitur pengurutan data. Indeks awalan adalah indeks bawaan yang secara otomatis dibuat oleh SelectDB setelah tabel dibuat.

Tidak ada sintaks khusus yang tersedia untuk mendefinisikan indeks awalan. Sistem memilih satu atau lebih bidang kolom kunci pertama dalam tabel sebagai indeks awalan. Panjang total indeks awalan tidak boleh melebihi 36 byte. Bidang kolom kunci setelah bidang tipe VARCHAR tidak ditambahkan ke indeks awalan.

Urutan bidang dalam tabel sangat penting karena menentukan bidang mana yang akan digunakan dalam indeks awalan. Kami sangat merekomendasikan Anda menentukan urutan bidang kolom kunci berdasarkan aturan berikut:

  • Bidang kolom kunci dengan kardinalitas tinggi yang sering digunakan sebagai kondisi filter ditempatkan sebelum bidang lainnya. Misalnya, dalam bagian Gunakan Model Duplicate, bidang log_time ditempatkan sebelum bidang error_code.

  • Bidang kolom kunci yang digunakan sebagai kondisi filter ekuivalen ditempatkan sebelum bidang kolom kunci yang digunakan sebagai kondisi filter rentang. Misalnya, dalam bagian Gunakan Indeks Terbalik, bidang order_time untuk penyaringan rentang ditempatkan setelah bidang order_id.

  • Bidang tipe biasa ditempatkan sebelum bidang tipe VARCHAR. Misalnya, bidang kolom kunci tipe INT ditempatkan sebelum bidang kolom kunci tipe VARCHAR.

Contoh

Dalam bagian Gunakan Indeks Terbalik, tabel informasi pesanan menggunakan indeks awalan order_id+order_time. Jika kondisi query berisi bidang order_id atau berisi kedua bidang order_id dan order_time, kecepatan query meningkat secara signifikan. Kecepatan query di Contoh 1 lebih cepat daripada di Contoh 2.

Contoh 1

SELECT * FROM orders WHERE order_id = 1829239 and order_time = '2024-02-01';

Contoh 2

SELECT * FROM orders WHERE order_time = '2024-02-01';

Apa yang harus dilakukan selanjutnya

Setelah mempelajari tiga langkah pertama dari tutorial ini, Anda telah memperoleh pemahaman dasar tentang ApsaraDB for SelectDB dan mampu merancang tabel database yang sesuai dengan kebutuhan bisnis Anda. Selanjutnya, Anda dapat mempelajari operasi lebih rinci, seperti migrasi data, menanyakan data dari sumber data eksternal, serta memperbarui versi kernel. Untuk informasi lebih lanjut, lihat Apa yang harus dilakukan selanjutnya.