SQLite'da birincil anahtar için dizin gerekli mi?


130

Bir tamsayı sütunu bir SQLite tablosunda birincil anahtar olarak işaretlendiğinde, bunun için de açıkça bir dizin oluşturulmalı mı? SQLite, birincil anahtar sütunu için otomatik olarak bir dizin oluşturuyor gibi görünmüyor, ancak belki de amacı göz önüne alındığında yine de dizine alıyor? (Her zaman o sütunda arama yapacağım).

Bir string birincil anahtar için durum farklı olur mu?

Yanıtlar:


149

Bunu sizin için yapar.

INTEGER PRIMARY KEY sütunları bir yana, hem UNIQUE hem de PRIMARY KEY kısıtlamaları, veritabanında bir indeks oluşturarak uygulanır ("CREATE UNIQUE INDEX" ifadesiyle aynı şekilde). Böyle bir indeks, sorguları optimize etmek için veritabanındaki diğer indeksler gibi kullanılır. Sonuç olarak, halihazırda toplu olarak UNIQUE veya PRIMARY KEY kısıtlamasına tabi olan bir dizi sütun üzerinde bir dizin oluşturmanın çoğu zaman hiçbir avantajı (ancak önemli ek yükü) yoktur.


8
Aslında, "PRIMARY KEY özniteliği normalde PRIMARY KEY olarak belirtilen sütun veya sütunlarda UNIQUE indeks oluşturur" diyor. Ancak bu indeks SQLite yönetim uygulamalarında görünmüyor, bu yüzden sordum.
Marek Jedliński

1
sqlite_masterTabloda ile başlayan bir addan bahsedilmektedir sqlite_autoindex_.
dan04

2
Geç, ama @NicolasZozol evet, eğer yoksa , ana / başvurulan alan (lar) da bir dizin (veya bir kısıtlama) oluşturmanız gerekir ; alt / başvuran alanların bir dizine sahip olması önerilir (bu genellikle benzersiz değildir): buraya bakınUNIQUEUNIQUE
TripeHound

2
Hmm, SQL Data Constraints buradaki bölüm şunu söylüyor: Çoğu durumda , UNIQUE ve PRIMARY KEY kısıtlamaları, veritabanında benzersiz bir dizin oluşturarak uygulanır. (INTEGER PRIMARY KEY ve ROWID OLMADAN tablolardaki PRIMARY KEY istisnalarıdır.). Yani cevap her zaman doğru değil mi?
Playful Curiosity

3
Rowid IS indekslenmiş gibi görünüyor, ancak farklı bir şekilde uygulanıyor sqlite.org/lang_createtable.html#rowid Rowid tablolarının verileri, rowid değerini anahtar olarak kullanarak, her tablo satırı için bir giriş içeren bir B-Tree yapısı olarak saklanır ... belirli bir satır kimliğine sahip bir kayıt için ... herhangi bir PRIMARY KEY veya indekslenmiş değer belirtilerek yapılan benzer bir aramadan yaklaşık iki kat daha hızlıdır.
matreshkin

15

Bir sütun INTEGER PRIMARY KEY olarak işaretlenmişse, aslında herhangi bir PRIMARY KEY veya indekslenmiş değer belirtilerek yapılan benzer bir aramadan yaklaşık iki kat daha hızlıdır . Bunun nedeni ise:

... SQLite tablolarındaki tüm satırlar, tablosu içindeki satırı benzersiz şekilde tanımlayan 64 bitlik işaretli bir tamsayı anahtarına sahiptir ... Belirli bir satır kimliğine sahip bir kaydı veya belirli bir aralıktaki satırları olan tüm kayıtları aramak, herhangi bir PRIMARY KEY veya indekslenmiş değer belirtilerek yapılan benzer bir arama kadar hızlı.

Aşağıda belirtilen bir istisna dışında, bir satır kimliği tablosunun tek bir sütundan oluşan bir birincil anahtarı varsa ve bu sütunun bildirilen türü , büyük ve küçük harflerin herhangi bir karışımında "INTEGER" ise , sütun, rowid için bir takma ad olur.

Böyle bir sütun genellikle "tamsayı birincil anahtar" olarak adlandırılır. Bir PRIMARY KEY sütunu, bildirilen tür adı tam olarak "INTEGER" ise, yalnızca bir tamsayı birincil anahtar haline gelir. "INT" veya "BIGINT" veya "SHORT INTEGER" veya "UNSIGNED INTEGER" gibi diğer tamsayı türü isimleri, birincil anahtar sütununun, satır kimliği için bir takma ad olarak değil, tamsayı yakınlığı ve benzersiz bir indeksi olan sıradan bir tablo sütunu gibi davranmasına neden olur.

Bakınız: http://www.sqlite.org/lang_createtable.html#rowid


8

Bir veritabanı, benzersiz bir birincil anahtar için her zaman sessizce bir dizin oluşturur, böylece benzersiz olup olmadığını dahili olarak kontrol edebilir.

Onu yarattıktan sonra, gerektiğinde kullanacaktır.

Elbette her zaman kümelenmez ve genellikle şemada olmasını isteyip istemediğinizi belirtirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.