Dalam posting blog ini kita akan membahas salah satu fitur MySQL yang paling banyak digunakan - partisi.
Apa itu Partisi?
Di MySQL, partisi adalah teknik desain database di mana database membagi data menjadi beberapa tabel, tetapi masih memperlakukan data sebagai satu tabel oleh lapisan SQL. Sederhananya, ketika Anda mempartisi tabel, Anda membaginya menjadi beberapa sub-tabel:partisi digunakan karena ini meningkatkan kinerja kueri tertentu dengan mengizinkan mereka hanya mengakses sebagian data sehingga membuatnya lebih cepat. Operasi I/O juga dapat ditingkatkan karena data dan indeks dapat dibagi menjadi banyak volume disk.
Ada dua jenis partisi:horizontal dan vertikal. Partisi horizontal melibatkan penempatan baris yang berbeda ke dalam tabel yang berbeda, partisi vertikal di sisi lain melibatkan pembuatan tabel dengan kolom lebih sedikit dan menggunakan tabel tambahan untuk menyimpan kolom yang tersisa.
Bagaimana Cara Kerja Partisi?
- Saat kueri SELECT digunakan, lapisan partisi akan membuka dan mengunci partisi, pengoptimal kueri menentukan apakah ada partisi yang dapat dipangkas, lalu lapisan partisi meneruskan panggilan API pengendali ke mesin penyimpanan yang menangani partisi.
- Saat kueri INSERT digunakan, lapisan partisi akan membuka dan mengunci partisi, menentukan partisi mana yang seharusnya menjadi milik baris, lalu meneruskan baris ke partisi tersebut.
- Saat kueri DELETE digunakan, lapisan partisi akan membuka dan mengunci partisi, menentukan partisi mana yang berisi baris, lalu menghapus baris dari partisi tersebut.
- Saat kueri UPDATE digunakan, lapisan partisi akan membuka dan mengunci partisi, mencari tahu partisi mana yang berisi baris, mengambil baris dan memodifikasinya, lalu menentukan partisi mana yang harus berisi baris baru, meneruskan baris ke partisi baru dengan permintaan penyisipan, lalu meneruskan permintaan penghapusan ke partisi asli.
Kapan Anda Harus Menggunakan Partisi?
Secara umum, mempartisi berguna jika:
- Anda memiliki banyak data yang perlu Anda kueri.
- Tabel Anda terlalu besar untuk disimpan di memori.
- Tabel Anda berisi data historis dan data baru ditambahkan ke partisi terbaru.
- Menurut Anda, Anda perlu mendistribusikan konten tabel ke berbagai perangkat penyimpanan.
- Menurut Anda, Anda perlu memulihkan setiap partisi.
Jika satu atau lebih skenario yang dijelaskan di atas menggambarkan situasi Anda, partisi dapat membantu. Sebelum mempartisi data Anda, perlu diingat bahwa partisi MySQL memiliki batasannya sendiri:
- Ekspresi partisi tidak mengizinkan penggunaan prosedur tersimpan, fungsi tersimpan, fungsi yang ditentukan pengguna (UDF) atau plugin, dan dengan dukungan terbatas untuk fungsi SQL. Anda juga tidak dapat menggunakan variabel yang dideklarasikan atau disimpan.
- Tabel yang dipartisi tidak boleh berisi atau direferensikan oleh kunci asing.
- Ada batas 1.024 partisi per tabel (mulai dari MariaDB 10.0.4, tabel dapat berisi maksimum 8.192 partisi).
- Sebuah tabel hanya dapat dipartisi jika mesin penyimpanan mendukung partisi.
- Cache kueri tidak mengetahui adanya partisi atau pemangkasan partisi.
- Semua partisi harus menggunakan mesin penyimpanan yang sama.
- Indeks FullTEXT tidak didukung
- Tabel sementara tidak dapat dipartisi
Opsi di atas akan membantu Anda memutuskan apakah mempartisi merupakan opsi untuk Anda atau tidak.
Jenis Partisi
Jika Anda memutuskan untuk menggunakan partisi, ingatlah bahwa Anda memiliki sejumlah jenis partisi untuk dipilih. Kami akan membahas opsi Anda secara singkat di bawah, lalu menyelami lebih dalam ke dalamnya:
- Mempartisi menurut RANGE dapat membantu Anda mempartisi baris berdasarkan nilai kolom yang berada dalam rentang tertentu.
- Mempartisi menurut LIST dapat membantu Anda mempartisi baris berdasarkan keanggotaan nilai kolom dalam daftar tertentu.
- Mempartisi dengan HASH dapat membantu Anda mempartisi baris berdasarkan nilai yang dikembalikan oleh ekspresi yang ditentukan pengguna.
- Mempartisi dengan KEY dapat membantu Anda mempartisi baris berdasarkan fungsi hashing yang disediakan oleh MySQL.
Partisi menurut RANGE
Partisi menurut RANGE adalah salah satu bentuk paling populer untuk mempartisi tabel MySQL. Saat Anda mempartisi tabel menurut RANGE, Anda mempartisi tabel sedemikian rupa sehingga setiap partisi berisi sejumlah baris tertentu yang termasuk dalam rentang tertentu. Untuk menentukan partisi, tentukan namanya, lalu beri tahu nilai mana yang harus dipegangnya - untuk mempartisi tabel berdasarkan rentang, tambahkan pernyataan PARTITION BY RANGE. Misalnya, jika Anda ingin memberi nama partisi Anda p0 dan membuatnya menampung setiap nilai yang kurang dari 5, Anda perlu memastikan bahwa kueri Anda berisi PARTITION p0 NILAI KURANG DARI (5). Berikut ini contoh tabel yang dipartisi:
CREATE TABLE sample_table (
id INT(255) NOT NULL AUTO_INCREMENT PRIMARY KEY,
column_name VARCHAR(255) NOT NULL DEFAULT ‘’
...
) PARTITION BY RANGE (column_name) (
PARTITION p0 VALUES LESS THAN (5),
PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (15),
PARTITION p3 VALUES LESS THAN (20),
...
);
Anda juga dapat menentukan partisi yang menampung semua nilai yang tidak termasuk dalam rentang tertentu seperti:
PARTITION p5 VALUES LESS THAN MAXVALUE
Partisi di atas bernama p5 dan memegang semua nilai yang tidak dimiliki partisi lain - MAXVALUE mewakili nilai yang selalu lebih tinggi dari nilai terbesar yang mungkin. Anda juga dapat menggunakan fungsi dengan mendefinisikan partisi Anda seperti ini:
PARTITION BY RANGE (YEAR(date)) (
PARTITION p0 VALUES LESS THAN (2000),
PARTITION p1 VALUES LESS THAN (2010),
PARTITION p2 VALUES LESS THAN (2020),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
Dalam hal ini, semua nilai yang kurang dari 2000 disimpan di partisi p0, semua nilai yang kurang dari 2010 disimpan di partisi p1, semua nilai yang kurang dari 2020 disimpan di partisi p2 dan semua nilai yang tidak termasuk dalam rentang ini disimpan di partisi p3.
Partisi menurut LIST
Mempartisi tabel MySQL dengan LIST mirip dengan mempartisi berdasarkan RANGE - perbedaan utama dari mempartisi tabel dengan LIST adalah ketika tabel dipartisi oleh LIST, setiap partisi ditentukan dan dipilih berdasarkan keanggotaan nilai kolom dalam satu set daftar nilai daripada rentang nilai. Mempartisi menurut LIST dapat berguna saat Anda mengetahui bahwa, misalnya, Anda memiliki data yang dapat dibagi menjadi beberapa kumpulan data yang lebih kecil (misalnya, wilayah). Misalkan Anda memiliki toko yang memiliki 4 waralaba:satu di bagian tengah kota, kedua di utara, ketiga di timur, keempat di barat. Anda dapat mempartisi tabel sedemikian rupa sehingga data milik waralaba tertentu akan disimpan di partisi yang didedikasikan untuk waralaba itu:
PARTITION BY LIST(store) (
PARTITION central VALUES IN (1,3,5),
PARTITION north VALUES IN (2,4,7),
PARTITION east VALUES IN (8,9),
PARTITION west VALUES IN (10,11)
);
Partisi dengan HASH
Mempartisi tabel MySQL dengan HASH dapat menjadi cara untuk memastikan bahwa data di seluruh partisi didistribusikan secara merata. Jika Anda mempartisi tabel Anda dengan HASH, Anda hanya perlu menentukan berapa banyak partisi yang Anda perlukan untuk membagi data Anda - sisanya ditangani oleh MySQL. Anda dapat menggunakan partisi dengan HASH dengan menambahkan pernyataan berikut ke CREATE TABLE:
PARTITION BY HASH(id)
PARTITIONS 5;
Ganti 5 dengan angka yang menentukan berapa banyak partisi yang Anda perlukan untuk membagi data Anda - angka defaultnya adalah 1.
MySQL juga mendukung partisi dengan LINEAR HASH - hashing linier berbeda dari hashing biasa karena hashing linier menggunakan algoritme kekuatan dua linier. Untuk mempartisi tabel dengan LINEAR HASH, ganti PARTITION BY HASH dengan PARTITION BY LINEAR HASH.
Partisi dengan KUNCI
Mempartisi tabel MySQL dengan KEY mirip dengan mempartisi tabel MySQL dengan HASH - dalam hal ini, fungsi hashing untuk partisi kunci disediakan oleh server MySQL. Setiap kolom yang digunakan sebagai kunci partisi harus terdiri dari kunci utama seluruh tabel atau setidaknya menjadi bagian dari kunci utama tabel. Jika tidak ada nama kolom yang ditentukan sebagai kunci partisi, kunci utama akan digunakan. Jika tidak ada kunci utama, tetapi ada kunci unik, kunci unik akan digunakan sebagai gantinya. Misalnya, pernyataan berikut keduanya valid, meskipun pernyataan pertama bahkan tidak menentukan kunci partisi:
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL DEFAULT ''
)
PARTITION BY KEY()
PARTITIONS 2;
CREATE TABLE demo_table (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)
PARTITION BY KEY(id)
PARTITIONS 5;
Kesimpulan
Untuk meringkas, partisi dapat membantu jika Anda memiliki banyak data, tabel Anda terlalu besar untuk ditampung dalam memori atau berisi data historis. Partisi juga dapat berguna jika Anda merasa perlu mendistribusikan konten tabel ke berbagai media penyimpanan, juga jika Anda ingin memiliki opsi untuk menghapus atau memulihkan partisi individual.
Namun, perlu diingat bahwa partisi di MySQL memiliki kekurangannya sendiri. Salah satu kelemahan utama dari mempartisi adalah akan membuat tabel Anda lebih besar - Anda tidak dapat memperoleh kecepatan tanpa mengorbankan ruang. Jika Anda memiliki kumpulan data yang sangat besar, ini bisa menjadi masalah yang cukup besar.