Traffine I/O

Bahasa Indonesia

2023-04-07

Indeks B-Tree

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:

sql
CREATE INDEX index_name ON table_name (column_name);

Untuk membuat indeks gabungan pada beberapa kolom, sintaksnya sedikit berbeda:

sql
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:

sql
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:

sql
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:

sql
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:

sql
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.

sql
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.

sql
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:

sql
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.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!