Dalam sistem basis data relasional, indeks basis data adalah alat yang sangat kuat untuk pengambilan data. Dalam panduan ini, Anda mempelajari tentang indeks unik, kunci utama, dan kunci utama komposit.
Apa yang dimaksud dengan Indeks Basis Data?
Sebuah Indeks Basis Data adalah objek struktur data yang terkait dengan tabel database. Ini digunakan untuk meningkatkan kecepatan kueri basis data (melalui SQL SELECT
memerintah). Secara umum, ada metode yang terdefinisi dengan baik untuk memutuskan jenis indeks yang akan dibuat. Ini sebagian besar diatur oleh bagaimana tabel dalam database berhubungan satu sama lain dan bagaimana data diambil.
Mengapa Menggunakan Indeks?
Secara umum, query (atau pencarian) dalam tabel melalui SQL SELECT
perintahnya berurutan. Pencarian berurutan membutuhkan mulai dari bagian atas tabel dan membaca setiap baris data hingga data yang diinginkan diambil. Ini sangat tidak efisien dan dapat menjadi operasi yang mahal dalam hal kecepatan.
Indeks, di sisi lain, menggunakan fungsi hash untuk menghitung nilai indeks. Ini menyediakan akses langsung ke baris (kunci) yang terpengaruh dalam indeks. Setelah baris (kunci) tersebut berada di indeks, catatan indeks memiliki penunjuk langsung ke baris tabel yang diperlukan dalam kueri. Pointer ini dibuat selama pembuatan indeks dan pemeliharaan indeks. Kecepatan pengambilan data saat menggunakan indeks meningkat sesuai urutan besarnya.
Anatomi Indeks Basis Data Unik
Tabel database dapat memiliki satu atau lebih indeks terkait. Indeks itu sendiri menyimpan nilai baris (kunci) dari satu atau lebih kolom dalam sebuah tabel. Ini juga memiliki pointer yang menunjuk ke baris tabel aktual yang berisi nilai-nilai kunci ini. Jumlah baris yang ditunjuk oleh kunci tertentu dalam indeks bergantung pada apakah indeks tersebut indeks unik atau indeks non-unik .
Seperti namanya, indeks unik berisi kunci yang menunjuk hanya satu baris data dalam tabel tertentu. Indeks unik memastikan bahwa setiap baris dalam tabel berisi nilai unik dalam kolom tabel terindeks yang ditentukan. Secara efektif, tidak ada dua baris yang dapat memiliki nilai identik dalam kolom yang diindeks. Selain itu, indeks unik dibuat pada kolom yang ditetapkan sebagai kunci utama untuk meja. Kunci utama didefinisikan sebagai satu atau lebih kolom yang secara unik mendefinisikan baris dalam tabel database.
Contoh di bawah ini menunjukkan bagaimana kunci utama dan indeks unik digunakan dalam SQL. Semua contoh menggunakan tabel bernama Student
, dalam contoh database bernama exampledb
. Untuk menambahkan data contoh gunakan perintah berikut:
INSERT INTO Student(SSNumber, LastName, FirstName)
VALUES
(111111111, Smith, John),
(222222222, Jones, Mary),
(333333333, Hansen, Robert);
Lihat data yang disimpan di Student
tabel:
SELECT * FROM Student;
Anda akan melihat output berikut:
+-----------+----------+-----------+
| SSNumber | LastName | FirstName |
+-----------+----------+-----------+
| 111111111 | Smith | John |
| 222222222 | Jones | Mary |
| 333333333 | Hansen | Robert |
+-----------+----------+-----------+
Catatan Kecuali disebutkan sebaliknya, semua perintah dalam panduan ini bekerja dengan baik di kedua MySQL dan PostgreSQL database.
Kunci dan Indeks Utama Kolom Tunggal
Sebagai contoh, asumsikan bahwa sekolah melacak siswanya dalam tabel bernama Student
. Tabel ini memiliki kolom terkait bernama Student
, SSNumber
, LastName
, dan FirstName
. Dari kolom ini, Student
adalah kolom kunci utama karena secara unik mengidentifikasi setiap baris data di Student
meja. Buat indeks unik (SSIndex
) pada SSNumber
kolom, untuk memfasilitasi pengambilan data secara cepat dari tabel. Perintah SQL DDL berikut digunakan untuk melakukan kueri ini:
CREATE TABLE Student (SSNumber CHAR(9) NOT NULL,LastName VARCHAR(30) NOT NULL,FirstName VARCHAR(20) NOT NULL,PRIMARY KEY (SSNumber));
CREATE UNIQUE INDEX SSIndex ON Student (SSNumber);
Catatan Kedua perintah SQL di atas dibatasi oleh titik koma (;), yang kompatibel dengan sebagian besar sistem basis data relasional. SSNumber
secara khusus ditunjuk sebagai kunci utama tabel.
SSIndex
hanya berisi informasi yang secara unik mengidentifikasi data di setiap baris Student
meja. Setiap baris SSIndex
memiliki pointer ke baris yang sesuai di Student
meja. Ini SSIndex
index memungkinkan Anda menghindari pencarian data berurutan dalam tabel yang meningkatkan kinerja dengan meminimalkan waktu yang dibutuhkan untuk kueri.
Untuk menemukan informasi terkait untuk Robert Hansen
melalui SSNumber
mereka , gunakan perintah SQL yang disertakan di bawah ini. Perintah tidak hanya menghilangkan pencarian berurutan Student
tabel tetapi juga menggunakan SSIndex
untuk menyediakan akses langsung ke baris data yang diperlukan. Ini berdasarkan penggunaan fungsi hashing dan penunjuk indeks terkait.
SELECT * FROM Student WHERE SSNumber = 333333333;
Data yang dikembalikan harus sebagai berikut:
+-----------+----------+-----------+
| SSNumber | LastName | FirstName |
+-----------+----------+-----------+
| 333333333 | Hansen | Robert |
+-----------+----------+-----------+
Kunci Utama dan Indeks Komposit Multi-Kolom
Contoh bagian ini menggunakan tiga tabel yang menyimpan data yang terkait dengan liga tenis. Ketiga tabel tersebut diberi nama Player
, League
, dan Membership
. Seorang pemain dapat bermain di beberapa liga, dan tabel keanggotaan menyediakan asosiasi itu. Tiga tabel memiliki kolom berikut yang terkait dengannya:
Kolom Player
tabel ditampilkan di bawah dengan PlayedID
sebagai kunci utama.
+----------+-----------+-----------+
| PlayedID | LastName | FirstName |
+----------+-----------+-----------+
Kolom League
tabel ditampilkan di bawah dengan LeagueId
sebagai kunci utama.
+----------+------------+------------+
| LeagueId | LeagueName | SkillLevel |
+----------+------------+------------+
Kolom Membership
tabel ditampilkan di bawah
+----------+-----------+
| PlayedID | LeagueId |
+----------+-----------+
Langkah-langkah di bawah ini menunjukkan cara membuat Player
, League
, dan Membership
tabel.
-
Dari
Player
tabel,PlayedID
kolom secara unik mengidentifikasi setiap baris data. BuatPlayer
tabel diikuti oleh indeks unik padaPlayerId
kolom.CREATE TABLE Player ( PlayedID INT NOT NULL, LastName VARCHAR(30) NOT NULL, FirstName VARCHAR(20) NOT NULL, PRIMARY KEY (PlayedID) ); CREATE UNIQUE INDEX PlayerIndex ON Player (PlayedID);
-
Dari
League
tabel,LeagueId
kolom secara unik mengidentifikasi setiap baris data. BuatLeague
tabel diikuti oleh indeks unik padaLeagueId
kolom. Berikut adalah perintah SQL untuk melakukan operasi ini:CREATE TABLE League ( LeagueId INT NOT NULL, LeagueName VARCHAR(50) NOT NULL, SkilLevel VARCHAR(20) NOT NULL, PRIMARY KEY (LeagueId) ); CREATE UNIQUE INDEX LeagueIndex ON League (LeagueId);
-
Dari
Membership
tabel, keduanyaPlayedID
danLeagueId
kolom secara unik mengidentifikasi setiap baris data; yang merupakan kunci primer komposit. BuatMembership
tabel diikuti oleh indeks komposit unik padaPlayedID
danLeagueId
kolom.CREATE TABLE Membership ( PlayerId INT NOT NULL, LeagueId INT NOT NULL, PRIMARY KEY(PlayerId, LeagueId) ); CREATE UNIQUE INDEX MembershipIndex ON Membership (PlayerId, LeagueId);
MembershipIndex
adalah indeks yang dihasilkan hash yang terdiri dari Kunci Komposit(PlayedId
dan LeagueId
). Ini memiliki pointer ke baris data yang diwakilinya. Penggunaan indeks semacam itu memfasilitasi pengambilan data akses langsung yang cepat, sebagai lawan dari pengambilan data sekuensial linier. Misalnya, untuk menentukan semua pemain yang terkait dengan “Ganda Putra” dari beberapa rekor di masing-masing tabel di atas, Anda dapat mengeluarkan perintah SQL berikut:
SELECT Player.LastName, Player.Firstname
FROM Player, Membership
WHERE Membership.LeagueId = 2
AND Membership.PlayerId = Player.PlayerId
Data berikut dikembalikan:
+----------+-----------+
| LastName | FirstName |
+----------+-----------+
| Smith | John |
| Hansen | Robert |
+-----------+----------+
Tanpa menggunakan MembershipIndex
dan PlayerIndex
, kueri di atas akan dieksekusi secara signifikan lebih lambat.
Indeks Non-Unik
Indeks non-unik berisi entri yang mungkin mengarah ke satu atau lebih baris untuk nilai kunci yang diberikan. Misalnya, untuk mencari berdasarkan nama seseorang, perlu membuat indeks komposit non-unik pada tabel untuk kedua FirstName
dan LastName
. Sejak kombinasi FirstName
dan LastName
tidak dapat dijamin unik, indeks yang dihasilkan yang dibuat pada dua kolom tersebut secara efektif menghasilkan indeks yang tidak unik.
Masalah Penurunan Kinerja Database Menggunakan Indeks
Sementara indeks membantu kecepatan eksekusi kueri, mereka perlu diperbarui setiap kali kolom yang diindeks berubah atau ketika baris tabel ditambahkan atau dihapus dari database. Ini dapat merusak kinerja database. Penting untuk mengingat jumlah penyisipan, penghapusan, dan modifikasi yang diperlukan dari indeks Anda selama penggunaan basis data transaksional. Pertimbangkan apa yang penting bagi Anda dalam aplikasi database; kecepatan eksekusi query atau kecepatan manipulasi data. Jawaban atas pertanyaan tersebut terletak pada bagaimana aplikasi database digunakan, seberapa sering hal itu mempengaruhi desain database, dan jumlah indeks yang dibuat.
Kesimpulan
Membuat dan menggunakan indeks basis data menghasilkan respons pengambilan kueri yang cepat dan menghilangkan pencarian baris berurutan dari tabel. Namun, pemeliharaan indeks melalui manipulasi data dapat memiliki dampak kinerja yang merugikan pada database. Perancang basis data perlu menyadari pertukaran yang terlibat saat menggunakan indeks basis data dan mengingat pengoptimalan untuk kinerja basis data secara keseluruhan.