Ringkasan :dalam tutorial ini, Anda akan mempelajari cara menggunakan indeks SQLite untuk membuat kueri data lebih cepat, mempercepat operasi pengurutan, dan menerapkan batasan unik.
Apa itu indeks?
Dalam database relasional, tabel adalah daftar baris. Pada saat yang sama, setiap baris memiliki struktur kolom yang sama yang terdiri dari sel. Setiap baris juga memiliki nomor urut rowid berurutan yang digunakan untuk mengidentifikasi baris. Oleh karena itu, Anda dapat menganggap tabel sebagai daftar pasangan:(baris, baris).
Tidak seperti tabel, indeks memiliki hubungan yang berlawanan:(baris, baris). Indeks adalah struktur data tambahan yang membantu meningkatkan kinerja kueri.
SQLite menggunakan B-tree untuk mengatur indeks. Perhatikan bahwa B singkatan dari balanced, B-tree adalah balanced tree, bukan binary tree.
B-tree menjaga jumlah data di kedua sisi pohon seimbang sehingga jumlah level yang harus dilalui untuk menemukan baris selalu dalam jumlah perkiraan yang sama. Selain itu, kueri menggunakan kesetaraan (=) dan rentang (>,>=, <,<=) pada indeks B-tree sangat efisien.
Bagaimana cara kerja indeks
Setiap indeks harus dikaitkan dengan tabel tertentu. Indeks terdiri dari satu atau lebih kolom, tetapi semua kolom indeks harus berada dalam tabel yang sama. Sebuah tabel mungkin memiliki beberapa indeks.
Setiap kali Anda membuat indeks, SQLite membuat struktur B-tree untuk menyimpan data indeks.
Indeks berisi data dari kolom yang Anda tentukan dalam indeks dan rowid
yang sesuai nilai. Ini membantu SQLite dengan cepat menemukan baris berdasarkan nilai kolom yang diindeks.
Bayangkan sebuah indeks dalam database seperti indeks sebuah buku. Dengan melihat indeks, Anda dapat dengan cepat mengidentifikasi nomor halaman berdasarkan kata kunci.
SQLite CREATE INDEX
pernyataan
Untuk membuat indeks, Anda menggunakan CREATE INDEX
pernyataan dengan sintaks berikut:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);
Code language: SQL (Structured Query Language) (sql)
Untuk membuat indeks, Anda menentukan tiga informasi penting:
- Nama indeks setelah
CREATE INDEX
kata kunci. - Nama tabel milik indeks.
- Daftar kolom indeks.
Jika Anda ingin memastikan bahwa nilai dalam satu atau beberapa kolom unik seperti email dan telepon, gunakan UNIQUE
opsi di CREATE INDEX
penyataan. CREATE UNIQUE INDEX
membuat indeks unik baru.
SQLite UNIQUE
contoh indeks
Mari buat tabel baru bernama contacts
untuk demonstrasi.
CREATE TABLE contacts (
first_name text NOT NULL,
last_name text NOT NULL,
email text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Cobalah
Misalkan, Anda ingin menegakkan bahwa email itu unik, Anda membuat indeks unik sebagai berikut:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);
Code language: SQL (Structured Query Language) (sql)
Cobalah
Untuk menguji ini.
Pertama, masukkan baris ke dalam contacts
tabel.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Cobalah
Kedua, sisipkan baris lain dengan email duplikat.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Cobalah
SQLite mengeluarkan pesan kesalahan yang menunjukkan bahwa indeks unik telah dilanggar. Karena ketika Anda menyisipkan baris kedua, SQLite memeriksa dan memastikan bahwa email itu unik di seluruh baris di email
dari contacts
tabel.
Mari kita masukkan dua baris lagi ke dalam contacts
tabel.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
('Lisa','Smith','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Cobalah
Jika Anda meminta data dari contacts
tabel berdasarkan email tertentu, SQLite akan menggunakan indeks untuk mencari data. Lihat pernyataan berikut:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Cobalah
Untuk memeriksa apakah SQLite menggunakan indeks atau tidak, Anda menggunakan EXPLAIN QUERY PLAN
pernyataan sebagai berikut:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Cobalah
Contoh indeks multikolom SQLite
Jika Anda membuat indeks yang terdiri dari satu kolom, SQLite menggunakan kolom tersebut sebagai kunci pengurutan. Jika Anda membuat indeks yang memiliki banyak kolom, SQLite menggunakan kolom tambahan sebagai yang kedua, ketiga, … sebagai kunci pengurutan.
SQLite mengurutkan data pada indeks multicolumn menurut kolom pertama yang ditentukan dalam CREATE INDEX
penyataan. Kemudian, ia mengurutkan nilai duplikat menurut kolom kedua, dan seterusnya.
Oleh karena itu, urutan kolom sangat penting saat Anda membuat indeks multikolom.
Untuk menggunakan indeks multikolom, kueri harus berisi kondisi yang memiliki urutan kolom yang sama seperti yang didefinisikan dalam indeks.
Pernyataan berikut membuat indeks multikolom pada first_name
dan last_name
kolom contacts
tabel:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);
Code language: SQL (Structured Query Language) (sql)
Cobalah
Jika Anda menanyakan contacts
tabel dengan salah satu kondisi berikut di WHERE
klausa, SQLite akan menggunakan indeks multicolumn untuk mencari data.
1) memfilter data dengan first_name
kolom.
WHERE
first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
2) memfilter data dengan first_name
dan last_name
kolom:
WHERE
first_name = 'John' AND last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
Namun, SQLite tidak akan menggunakan indeks multikolom jika Anda menggunakan salah satu kondisi berikut.
1) filter dengan last_name
kolom saja.
WHERE
last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
2) filter menurut first_name
ATAU last_name
kolom.
last_name = 'Doe' OR first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
SQLite Tampilkan Indeks
Untuk menemukan semua indeks yang terkait dengan tabel, Anda menggunakan perintah berikut:
PRAGMA index_list('table_name');
Code language: SQL (Structured Query Language) (sql)
Misalnya, pernyataan ini menunjukkan semua indeks contacts
tabel:
PRAGMA index_list('playlist_track');
Code language: SQL (Structured Query Language) (sql)
Berikut adalah outputnya:
Untuk mendapatkan informasi tentang kolom dalam indeks, Anda menggunakan perintah berikut:
PRAGMA index_info('idx_contacts_name');
Code language: SQL (Structured Query Language) (sql)
Contoh ini mengembalikan daftar kolom indeks idx_contacts_name
:
Cara lain untuk mendapatkan semua indeks dari database adalah dengan melakukan query dari sqlite_master
tabel:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';
Code language: SQL (Structured Query Language) (sql)
SQLite DROP INDEX
pernyataan
Untuk menghapus indeks dari database, Anda menggunakan DROP INDEX
pernyataan sebagai berikut:
DROP INDEX [IF EXISTS] index_name;
Code language: SQL (Structured Query Language) (sql)
Dalam sintaks ini, Anda menentukan nama indeks yang ingin Anda jatuhkan setelah DROP INDEX
kata kunci. IF EXISTS
opsi menghapus indeks hanya jika ada.
Misalnya, Anda menggunakan pernyataan berikut untuk menghapus idx_contacts_name
indeks:
DROP INDEX idx_contacts_name;
Code language: SQL (Structured Query Language) (sql)
Cobalah
idx_contacts_name
indeks dihapus sepenuhnya dari database.
Dalam tutorial ini, Anda telah mempelajari tentang indeks SQLite dan cara memanfaatkan indeks untuk meningkatkan kinerja kueri atau menerapkan batasan unik.