Melakukan query pada tabel-tabel yang memiliki data yang jumlahnya besar akan sangat riskan karena memerlukan waktu eksekusi yang lama. Hal ini akan berdampak pada aplikasi yang terhubung dengan database kita. User akan kesal terhadap aplikasi yang ia gunakan karena lama sekali menampilkan informasi.

Pada post sebelumnya, i3 telah membahas tentang bagaimana mengimplementasikan index untuk mempercepat eksekusi Query. Kali ini, i3 akan membahas satu lagi cara untuk mempercepat query dan mempermudah administrasi data yang ada pada database. Salah satu caranya yaitu mengimplementasikan Partisi pada tabel dalam database.

Misalkan kita punya tabel PENJUALAN dengan 7 juta record, kita ingin melakukan query data untuk kuartal pertama tahun ini. Pada tabel konvensional (non partition), query akan men-scan keseluruhan 7 juta record data tersebut karena berada dalam 1 segment. Nah, kalau tabelnya telah dipartisi (by range untuk kolom tanggal penjualan) maka query akan men-scan khusus segment di mana data itu berada; tidak semua 7 juta records data di-scan, sehingga proses eksekusi query lebih cepat.

Manfaat lain dari tabel partisi adalah tiap-tiap segment (partisi atau subpartisi) bisa ditaruh di tablespace yang berbeda, sehingga kita mendapat manfaat dari spreading (menyebar) tablespace, yaitu penyebaran I/O dan mengurangi resiko loss data karena tablespace corrupt.

Untuk membuat tabel partisi, kita dapat menggunakan hampir semua storage engine yang didukung oleh MySQL server. Pada MySQL 5.7, semua partisi dari tabel partisi yang sama harus menggunakan mesin penyimpanan yang sama; misalnya, kita tidak dapat menggunakan MyISAM untuk satu partisi dan InnoDB untuk partisi yang lain. Namun, kita bisa menggunakan storage engine yang berbeda untuk tabel partisi yang berbeda pada MySQL server yang sama atau bahkan dalam satu database yang sama.

Ada 4 jenis partisi pada database MySQL yaitu:

  1. Range partitioning
  2. List partitioning
  3. Hash partitioning
  4. Key Partitioning

Pada artikel ini, i3 akan membahas cara membuat 2 jenis tabel partisi pada MySQL. Misalkan kita punya tabel PENJUALAN yang punya kolom no_invoice, tgl_jual, dan area.

Range Partition

Pada range partition, data dikelompokkan berdasarkan range (rentang) nilai yang kita tentukan. Range partition ini cocok digunakan pada kolom yang nilainya terdistribusi secara merata. Contoh yang paling sering adalah kolom tanggal.

Berikut ini contoh membuat table PENJUALAN dengan partisi range pada kolom tgl_jual (untuk menegaskan bahwa ini adalah contoh range partition, tabel kita beri nama PENJUALAN_RANGE):

List Partition

Pada list partition, data dikelompokkan berdasarkan nilainya. Cocok untuk kolom yang variasi nilainya tidak banyak. Disini kita masih menggunakan contoh table penjualan. Yang cocok dengan list partition adalah kolom area.

Berikut ini contoh membuat table PENJUALAN dengan partisi list pada kolom area (untuk membedakan dengan contoh range partition, tabel kita beri nama PENJUALAN_LIST):

Note: Kita tidak perlu menggunakan ekspresi COLUMNS ()  untuk mengkonversi nilai-nilai kolom untuk INTEGER.

Selain menerapkan partisi pada tabel, kita bisa melakukan optimasi pada query, melakukan I/O Tuning, dan tentunya maintenance pada sisi database. Ingin mempelajari lebih lanjut? Anda bisa mengikuti training SQL Tuning dan Performance Tuning yang disediakan oleh PT Inovasi Informatika Indonesia.