Apakah indeks diperlukan untuk kunci utama dalam SQLite?

130

Ketika kolom integer ditandai sebagai kunci utama dalam tabel SQLite, haruskah indeks juga dibuat secara eksplisit untuknya? SQLite tampaknya tidak secara otomatis membuat indeks untuk kolom kunci utama, tetapi mungkin indeks juga, mengingat tujuannya? (Saya akan mencari di kolom itu sepanjang waktu).

Apakah situasinya akan berbeda untuk kunci primer string?

Marek Jedliński
sumber

Jawaban:

148

Itu untuk Anda.

Di samping kolom INTEGER PRIMARY KEY kolom, baik batasan UNIK dan PRIMARY KEY dilaksanakan dengan membuat indeks dalam database (dengan cara yang sama seperti pernyataan "CREATE UNIQUE INDEX" akan). Indeks semacam itu digunakan seperti indeks lain dalam database untuk mengoptimalkan kueri. Akibatnya, seringkali tidak ada keuntungan (tetapi overhead yang signifikan) dalam membuat indeks pada set kolom yang secara kolektif tunduk pada batasan UNIK atau PRIMARY KEY.

hvgotcodes
sumber
8
Memang, dikatakan "Atribut PRIMARY KEY biasanya membuat indeks UNIK pada kolom atau kolom yang ditentukan sebagai PRIMARY KEY". Namun, indeks itu tidak terlihat dalam aplikasi manajemen SQLite, itu sebabnya saya bertanya.
Marek Jedliński
1
Disebutkan di sqlite_mastertabel dengan nama yang dimulai dengan sqlite_autoindex_.
dan04
2
Terlambat, tetapi @NicolasZozol ya Anda perlu membuat UNIQUEindeks (atau UNIQUEbatasan) pada bidang induk / referensi jika tidak ada; itu dianjurkan bahwa anak / bidang referensi (s) memiliki indeks (yang biasanya tidak akan menjadi unik): lihat di sini
TripeHound
2
Hmm, bagian di SQL Data Constraints sini mengatakan: Dalam kebanyakan kasus , UNIK dan PRIMARY KEY kendala diimplementasikan dengan membuat indeks unik dalam database. (Pengecualiannya adalah INTIMER PRIMARY KEY dan PRIMARY KEYs pada TANPA tabel ROWID.). Jadi jawabannya tidak selalu benar?
Curiosity Playful
3
Sepertinya rowid IS diindeks tetapi diimplementasikan secara berbeda sqlite.org/lang_createtable.html#rowid Data untuk tabel rowid disimpan sebagai struktur B-Tree yang mengandung satu entri untuk setiap baris tabel, menggunakan nilai rowid sebagai kuncinya ... Pencarian untuk catatan dengan rowid spesifik ... sekitar dua kali lebih cepat dari pencarian serupa yang dibuat dengan menentukan KUNCI UTAMA lainnya atau nilai yang diindeks.
matreshkin
15

Jika sebuah kolom ditandai KUNCI UTAMA UTAMA, itu sebenarnya sekitar dua kali lebih cepat dari pencarian serupa yang dilakukan dengan menentukan KUNCI UTAMA lainnya atau nilai yang diindeks . Hal ini karena:

... semua baris dalam tabel SQLite memiliki kunci integer bertanda 64-bit yang secara unik mengidentifikasi baris dalam tabelnya ... Mencari catatan dengan rowid tertentu, atau untuk semua catatan dengan rowid dalam rentang yang ditentukan sekitar dua kali lipat secepat pencarian serupa yang dilakukan dengan menentukan kunci PRIMARY atau nilai indeks lainnya.

Dengan satu pengecualian yang disebutkan di bawah ini, jika tabel rowid memiliki kunci utama yang terdiri dari satu kolom dan tipe kolom yang dinyatakan adalah "INTEGER" dalam campuran huruf besar dan kecil, maka kolom menjadi alias untuk rowid.

Kolom seperti itu biasanya disebut sebagai "kunci primer integer". Kolom KUNCI UTAMA hanya menjadi kunci primer integer jika nama tipe yang dideklarasikan persis "INTEGER". Nama tipe integer lain seperti "INT" atau "BIGINT" atau "SHORT INTEGER" atau "UNSIGNED INTEGER" menyebabkan kolom kunci utama berperilaku sebagai kolom tabel biasa dengan afinitas integer dan indeks unik, bukan sebagai alias untuk rowid.

Lihat: http://www.sqlite.org/lang_createtable.html#rowid

eiffel
sumber
8

Suatu basis data akan selalu membuat indeks untuk kunci primer unik secara diam-diam sehingga secara internal ia dapat memeriksanya unik secara efisien.

Setelah membuatnya, itu akan menggunakannya saat diperlukan.

Tentu saja, itu tidak akan selalu berkerumun, dan Anda menentukan biasanya dalam skema jika Anda menginginkannya.

Uang tunai
sumber