Apa itu Indeks B-Tree
B-Tree, kepanjangan dari Balanced Tree, adalah struktur data yang umum digunakan dalam domain database untuk membuat indeks. Indeks B-Tree membantu dalam mencari dan mengambil data secara efisien dalam database dengan menjaga struktur terurut dari data secara hierarkis.
Bayangkan sebuah pohon di mana bagian paling atas disebut akar (root), ujung bawah disebut daun (leaves), dan bagian di antaranya disebut cabang atau simpul internal (branches atau internal nodes). Dalam B-Tree, setiap simpul (node) berisi sejumlah kunci (keys) dan pointer anak (child pointers). Kunci-kunci dalam satu simpul diurutkan, dan setiap pointer menunjuk ke simpul anak. Karakteristik utama dari B-Tree adalah seimbang, yang berarti semua simpul daun berada pada kedalaman yang sama, sehingga jumlah langkah yang ditempuh untuk mencapai setiap daun adalah sama.
Keuntungan Indeks B-Tree
Indeks B-Tree memiliki berbagai keuntungan yang membuatnya menjadi pilihan populer untuk indeks database:
-
Akses Data Logaritmik
B-Tree memiliki keseimbangan tinggi, yang berarti data dapat diakses, dimasukkan, dan dihapus dalam waktu logaritmik. -
Pembacaan Disk Efisien
Karena database umumnya menyimpan data di disk, struktur pohon B-Tree efisien dalam meminimalkan pembacaan disk. -
Kueri Rentang
B-Tree sangat efektif untuk kueri rentang, karena dapat dengan cepat menemukan awal rentang dan kemudian memindai data secara linear.
Kolom yang Dijadikan Indeks
Saya akan menjelaskan pertimbangan yang harus Anda pikirkan ketika memutuskan kolom atau kumpulan kolom yang akan diindeks dalam database Anda. Membuat indeks tanpa pertimbangan yang tepat dapat mengakibatkan kinerja yang kurang optimal. Ada beberapa faktor yang perlu dipertimbangkan, seperti ukuran tabel, kardinalitas, dan penggunaan klausa WHERE dalam kueri Anda.
Ukuran Tabel
Ketika membahas ukuran tabel, penting untuk memahami bahwa tidak selalu menguntungkan untuk melakukan indeksasi. Untuk tabel yang kecil, memindai seluruh tabel mungkin lebih cepat daripada menggunakan indeks karena biaya indeksasi mungkin lebih besar daripada manfaatnya. Namun, ketika tabel semakin besar, indeks menjadi semakin penting untuk pengambilan data yang efisien.
Secara umum, indeksasi lebih menguntungkan ketika ukuran tabel besar. Biasanya disarankan untuk terus memantau pertumbuhan tabel Anda dan membuat indeks ketika Anda mulai mengamati penurunan kinerja dalam kueri Anda.
Kardinalitas
Kardinalitas mengacu pada jumlah nilai yang berbeda dalam sebuah kolom. Kardinalitas tinggi berarti kolom tersebut memiliki banyak nilai unik, sedangkan kardinalitas rendah berarti hanya ada sedikit nilai yang berbeda.
Kolom dengan kardinalitas tinggi seringkali menjadi kandidat yang baik untuk diindeks. Karena kolom-kolom ini memiliki rentang nilai yang luas, penggunaan indeks dapat secara signifikan mengurangi jumlah pembacaan disk yang diperlukan untuk sebuah kueri.
Di sisi lain, untuk kolom-kolom dengan kardinalitas rendah, indeks mungkin tidak begitu efektif. Karena hanya ada sedikit nilai unik, sebuah kueri kemungkinan harus membaca sebagian besar tabel, sehingga manfaat dari indeks menjadi terbatas.
Klausa WHERE
Kolom-kolom yang sering digunakan dalam klausa WHERE
pada kueri-kueri Anda seringkali menjadi kandidat yang baik untuk diindeks. Hal ini karena klausa WHERE
digunakan untuk menyaring baris-baris data, dan indeks dapat membantu mesin database untuk dengan cepat menemukan baris-baris yang relevan.
Sebagai contoh, jika Anda sering menjalankan kueri-kueri yang menyaring data berdasarkan rentang tanggal tertentu, mungkin akan menguntungkan untuk membuat indeks pada kolom tanggal.
Membuat Indeks B-Tree
Syntax SQL umum untuk membuat indeks B-Tree pada satu kolom adalah sebagai berikut:
CREATE INDEX index_name ON table_name (column_name);
Untuk membuat indeks gabungan pada beberapa kolom, sintaksnya sedikit berbeda:
CREATE INDEX index_name ON table_name (column1_name, column2_name, ...);
Beberapa database memungkinkan Anda untuk secara eksplisit menentukan jenis indeks yang akan dibuat, termasuk B-Tree. Sebagai contoh, dalam PostgreSQL:
CREATE INDEX index_name ON table_name USING btree (column_name);
Pola yang Tidak Bermakna pada Indeks B-Tree
Sekarang saya akan menjelaskan beberapa skenario atau pola di mana penggunaan indeks B-Tree tidak memberikan manfaat kinerja dan bahkan terkadang dapat menyebabkan ketidakefisienan.
Operasi Dilakukan pada Kolom Indeks
Ketika Anda menerapkan fungsi atau operasi apa pun pada kolom sebelum membandingkannya dengan sebuah nilai, database mungkin tidak dapat menggunakan indeks B-Tree dengan efektif. Sebagai contoh:
SELECT * FROM karyawan WHERE usia * 2 > 60;
Pada contoh ini, database tidak dapat menggunakan indeks pada kolom usia
secara efisien karena melakukan perkalian dengan 2 pada setiap entri sebelum melakukan perbandingan.
SQL Diterapkan pada Kolom Indeks
Seperti halnya menerapkan operasi, menerapkan fungsi SQL pada kolom indeks juga dapat membuat indeks tidak berguna. Sebagai contoh:
SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';
Dalam kueri ini, jika terdapat indeks pada nama_belakang, mungkin tidak digunakan dengan efisien karena database harus menerapkan fungsi UPPER()
pada setiap entri dalam kolom.
Menggunakan Predikat IS NULL
Indeks B-Tree mungkin tidak selalu efisien untuk kolom-kolom dengan jumlah nilai NULL
yang besar, terutama ketika mencari nilai NULL
. Sebagai contoh:
SELECT * FROM karyawan WHERE nama_tengah IS NULL;
Jika kolom nama_tengah
mengandung banyak nilai NULL
, menggunakan indeks B-Tree pada kolom ini mungkin tidak memberikan manfaat kinerja yang signifikan untuk kueri ini.
Menggunakan Operator OR
Ketika menggunakan operator OR
, database kadang-kadang dapat melakukan pemindaian keseluruhan tabel daripada menggunakan indeks, terutama ketika kolom-kolom yang terlibat memiliki kardinalitas rendah.
SELECT * FROM orders WHERE status = 'SHIPPED' OR status = 'PROCESSING';
Pada contoh ini, jika kolom status
memiliki sedikit nilai unik, indeks mungkin tidak efektif.
Menggunakan Predikat LIKE dengan Pencocokan Mundur dan Tengah
Ketika menggunakan LIKE
dengan pola yang tidak cocok di awal string, indeks B-Tree tidak akan digunakan dengan efisien.
SELECT * FROM produk WHERE nama_produk LIKE '%laptop%';
Dalam kueri ini, database tidak dapat memanfaatkan indeks pada nama_produk
karena menggunakan karakter wildcard di awal pola.
Konversi Tipe Tersirat Dilakukan
Konversi tipe yang tersirat dapat mencegah penggunaan indeks dengan efisien. Sebagai contoh:
SELECT * FROM karyawan WHERE id_departemen = '10';
Jika id_departemen
memiliki tipe integer, database harus melakukan konversi tipe sebelum dapat membandingkan nilai-nilai, yang dapat mengakibatkan penggunaan indeks yang tidak efisien.
Kunci Utama dan Kendala Unik dengan Indeks B-Tree
Di sini saya akan menjelaskan hubungan antara kunci utama, kendala unik, dan indeks B-Tree dalam database.
Kunci Utama dan Indeks B-Tree
Kunci utama adalah kolom atau kumpulan kolom dalam sebuah tabel yang secara unik mengidentifikasi setiap baris dalam tabel tersebut. Dalam database relasional, kunci utama memastikan integritas data dengan memastikan bahwa tidak ada baris duplikat dan setiap baris dapat diidentifikasi dengan unik.
Ketika Anda mendefinisikan kendala kunci utama pada kolom atau kumpulan kolom, sistem manajemen database secara otomatis membuat indeks B-Tree unik pada kolom-kolom tersebut. Hal ini karena kendala kunci utama membutuhkan database untuk menjamin keunikan dan pencarian cepat baris berdasarkan kunci utama. Indeks B-Tree sangat cocok untuk tujuan ini karena memiliki karakteristik pencarian logaritmik.
Oleh karena itu, tidak perlu membuat indeks secara manual pada kolom yang sudah didefinisikan sebagai kunci utama karena indeks B-Tree unik akan secara otomatis dibuat dan dikelola oleh database.
Kendala Unik dan Indeks B-Tree
Meskipun kunci utama memastikan keunikan untuk kolom-kolom yang mengidentifikasi sebuah tabel, ada skenario di mana Anda mungkin ingin memastikan bahwa kolom-kolom selain kunci utama juga unik. Inilah tempat kendala unik (unique constraint) masuk ke dalam peranannya. Kendala unik memastikan bahwa data yang terdapat dalam sebuah kolom, atau kombinasi kolom, bersifat unik di semua baris dalam tabel.
Sama seperti kunci utama, ketika Anda mendefinisikan kendala unik pada kolom atau kumpulan kolom, sistem manajemen database secara otomatis membuat indeks B-Tree unik pada kolom-kolom tersebut. Indeks ini membantu database dalam menerapkan kendala unik dengan efisien.
Seperti halnya kunci utama, tidak perlu membuat indeks tambahan pada kolom-kolom yang memiliki kendala unik, karena indeks B-Tree unik sudah secara otomatis dibuat dan dikelola oleh database.