Czy potrzebny jest indeks dla klucza podstawowego w SQLite?

134

Gdy kolumna z liczbą całkowitą jest oznaczona jako klucz podstawowy w tabeli SQLite, czy należy również jawnie utworzyć dla niej indeks? Wydaje się, że SQLite nie tworzy automatycznie indeksu dla kolumny klucza podstawowego, ale być może i tak go indeksuje, biorąc pod uwagę jego cel? (Cały czas będę szukał w tej kolumnie).

Czy sytuacja wyglądałaby inaczej w przypadku ciągu klucza podstawowego?

Marek Jedliński
źródło

Odpowiedzi:

152

Robi to za Ciebie.

Pomijając kolumny INTEGER PRIMARY KEY, zarówno ograniczenia UNIQUE, jak i PRIMARY KEY są implementowane przez utworzenie indeksu w bazie danych (w taki sam sposób, jak zrobiłaby to instrukcja „CREATE UNIQUE INDEX”). Taki indeks jest używany jak każdy inny indeks w bazie danych do optymalizacji zapytań. W rezultacie często nie ma żadnej korzyści (ale znaczne obciążenie) w tworzeniu indeksu na zestawie kolumn, które już łącznie podlegają ograniczeniu UNIQUE lub PRIMARY KEY.

hvgotcodes
źródło
9
Rzeczywiście, mówi: „Atrybut PRIMARY KEY zwykle tworzy UNIQUE indeks w kolumnie lub kolumnach, które są określone jako PRIMARY KEY”. Jednak indeks ten nie jest widoczny w aplikacjach do zarządzania SQLite, dlatego zapytałem.
Marek Jedliński
2
Jest wymieniony w sqlite_mastertabeli z nazwą zaczynającą się od sqlite_autoindex_.
dan04
3
Późno, ale @NicolasZozol tak, musisz utworzyć UNIQUEindeks (lub UNIQUEograniczenie) na polu (polach) nadrzędnym / odniesienia, jeśli nie istnieje; jest zalecana , że dziecko / odwoływania się pole (s) mają indeks (który zwykle nie będzie unikatowy): zobacz tutaj
TripeHound
3
Hmm, sekcja SQL Data Constraints tutaj mówi: W większości przypadków ograniczenia UNIQUE i PRIMARY KEY są implementowane poprzez utworzenie unikalnego indeksu w bazie danych. (Wyjątkami są INTEGER PRIMARY KEY i PRIMARY KEY w tabelach BEZ ROWID.). Więc odpowiedź nie zawsze jest prawdziwa?
Playful Curiosity
4
Wygląda na to, że rowid jest indeksowany, ale zaimplementowany w inny sposób sqlite.org/lang_createtable.html#rowid Dane tabel z identyfikatorami wierszy są przechowywane jako struktura B-Tree zawierająca jeden wpis dla każdego wiersza tabeli, używając wartości rowid jako klucza ... Wyszukiwanie dla rekordu z określonym identyfikatorem wiersza ... jest około dwa razy szybsze niż podobne wyszukiwanie wykonane przez podanie dowolnego innego KLUCZA PODSTAWOWEGO lub wartości indeksowanej.
matreshkin
15

Jeśli kolumna jest oznaczona jako INTEGER PRIMARY KEY, w rzeczywistości jest około dwa razy szybsza niż podobne wyszukiwanie wykonane przez podanie dowolnego innego klucza podstawowego lub wartości indeksowanej . To dlatego, że:

... wszystkie wiersze w tabelach SQLite mają 64-bitowy klucz liczby całkowitej ze znakiem, który jednoznacznie identyfikuje wiersz w tabeli ... Wyszukiwanie rekordu z określonym identyfikatorem wiersza lub wszystkich rekordów z identyfikatorami wierszy w określonym zakresie jest około dwa razy większe niż szybka jak podobne wyszukiwanie wykonane przez podanie dowolnego innego KLUCZA PODSTAWOWEGO lub wartości indeksowanej.

Z jednym wyjątkiem wymienionym poniżej, jeśli tabela identyfikatora wiersza ma klucz podstawowy składający się z pojedynczej kolumny, a zadeklarowanym typem tej kolumny jest „INTEGER” w dowolnej kombinacji dużych i małych liter, wówczas kolumna staje się aliasem identyfikatora wiersza.

Taka kolumna jest zwykle nazywana „całkowitym kluczem podstawowym”. Kolumna PRIMARY KEY staje się kluczem podstawowym w postaci liczby całkowitej tylko wtedy, gdy zadeklarowana nazwa typu to dokładnie „INTEGER”. Inne nazwy typów całkowitych, takie jak „INT”, „BIGINT”, „SHORT INTEGER” lub „UNSIGNED INTEGER”, powodują, że kolumna klucza podstawowego zachowuje się jak zwykła kolumna tabeli z powinowactwem do liczb całkowitych i unikalnym indeksem, a nie jako alias dla identyfikatora wiersza.

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

eiffel
źródło
9

Baza danych zawsze po cichu utworzy indeks dla unikalnego klucza podstawowego, aby mogła wewnętrznie sprawdzić, czy jest on unikalny.

Po utworzeniu będzie go używać, gdy będzie to konieczne.

Oczywiście nie zawsze będzie to klaster i zazwyczaj określasz w schemacie, czy chcesz, aby tak było.

Dojną krową
źródło