Shrnutí :v tomto tutoriálu se naučíte, jak používat indexy SQLite k rychlejšímu dotazování na data, urychlit operaci řazení a vynutit jedinečná omezení.
Co je index?
V relačních databázích je tabulka seznam řádků. Zároveň má každý řádek stejnou sloupcovou strukturu, která se skládá z buněk. Každý řádek má také po sobě jdoucí řádkové pořadové číslo používané k identifikaci řádku. Proto můžete tabulku považovat za seznam dvojic:(rowid, row).
Na rozdíl od tabulky má index opačný vztah:(řádek, řádek). Index je další datová struktura, která pomáhá zlepšit výkon dotazu.
SQLite používá B-strom pro organizaci indexů. Všimněte si, že B znamená vyvážený, B-strom je vyvážený strom, nikoli binární strom.
B-strom udržuje množství dat na obou stranách stromu vyvážené, takže počet úrovní, které je nutné projít, aby bylo možné najít řádek, je vždy ve stejném přibližném počtu. Kromě toho je velmi efektivní dotazování pomocí rovnosti (=) a rozsahů (>,>=, <,<=) na indexy B-stromu.
Jak index funguje
Každý index musí být spojen s určitou tabulkou. Index se skládá z jednoho nebo více sloupců, ale všechny sloupce indexu musí být ve stejné tabulce. Tabulka může mít více indexů.
Kdykoli vytvoříte index, SQLite vytvoří strukturu B-stromu pro uložení indexových dat.
Index obsahuje data ze sloupců, které zadáte v indexu, a odpovídající rowid hodnota. To pomáhá SQLite rychle najít řádek na základě hodnot indexovaných sloupců.
Představte si rejstřík v databázi jako rejstřík knihy. Když se podíváte na index, můžete rychle identifikovat čísla stránek na základě klíčových slov.
SQLite CREATE INDEX prohlášení
Chcete-li vytvořit index, použijte CREATE INDEX příkaz s následující syntaxí:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);Code language: SQL (Structured Query Language) (sql) Chcete-li vytvořit index, zadejte tři důležité informace:
- Název indexu za
CREATE INDEXklíčová slova. - Název tabulky do indexu patří.
- Seznam sloupců indexu.
V případě, že se chcete ujistit, že hodnoty v jednom nebo více sloupcích jsou jedinečné, jako je e-mail a telefon, použijte UNIQUE možnost v CREATE INDEX prohlášení. CREATE UNIQUE INDEX vytvoří nový jedinečný index.
SQLite UNIQUE příklad indexu
Vytvořme novou tabulku s názvem contacts pro demonstraci.
CREATE TABLE contacts (
first_name text NOT NULL,
last_name text NOT NULL,
email text NOT NULL
);Code language: SQL (Structured Query Language) (sql) Zkuste to
Předpokládejme, že chcete vynutit, aby byl e-mail jedinečný, vytvoříte jedinečný index následovně:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);Code language: SQL (Structured Query Language) (sql) Zkuste to
Chcete-li to vyzkoušet.
Nejprve vložte řádek do contacts tabulka.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','john.doe@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Zkuste to
Za druhé vložte další řádek s duplicitním e-mailem.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','john.doe@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Zkuste to
SQLite vydal chybovou zprávu oznamující, že byl porušen jedinečný index. Protože když jste vložili druhý řádek, SQLite zkontroloval a ujistil se, že e-mail je jedinečný napříč řádky v email z contacts tabulka.
Vložíme další dva řádky do contacts tabulka.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','david.brown@sqlitetutorial.net'),
('Lisa','Smith','lisa.smith@sqlitetutorial.net');Code language: SQL (Structured Query Language) (sql) Zkuste to
Pokud se dotazujete na data z contacts tabulky založené na konkrétním e-mailu, SQLite použije index k vyhledání dat. Viz následující prohlášení:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = 'lisa.smith@sqlitetutorial.net';Code language: SQL (Structured Query Language) (sql) Zkuste to
Chcete-li zkontrolovat, zda SQLite používá index nebo ne, použijte EXPLAIN QUERY PLAN prohlášení takto:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = 'lisa.smith@sqlitetutorial.net';Code language: SQL (Structured Query Language) (sql) Zkuste to
Příklad vícesloupcového indexu SQLite
Pokud vytvoříte index, který se skládá z jednoho sloupce, SQLite použije tento sloupec jako klíč řazení. V případě, že vytvoříte index, který má více sloupců, SQLite použije další sloupce jako druhý, třetí, … jako klíče řazení.
SQLite třídí data ve vícesloupcovém indexu podle prvního sloupce zadaného v CREATE INDEX prohlášení. Potom seřadí duplicitní hodnoty podle druhého sloupce a tak dále.
Proto je při vytváření vícesloupcového indexu velmi důležité pořadí sloupců.
Chcete-li použít vícesloupcový index, musí dotaz obsahovat podmínku, která má stejné pořadí sloupců, jaké je definováno v indexu.
Následující příkaz vytvoří vícesloupcový index na first_name a last_name sloupců contacts tabulka:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);Code language: SQL (Structured Query Language) (sql) Zkuste to
Pokud zadáte dotaz na contacts tabulka s jednou z následujících podmínek v WHERE klauzule, bude SQLite využívat vícesloupcový index k vyhledávání dat.
1) filtrovat data podle first_name sloupec.
WHERE
first_name = 'John';Code language: SQL (Structured Query Language) (sql)
2) filtrovat data podle first_name a last_name sloupce:
WHERE
first_name = 'John' AND last_name = 'Doe';Code language: SQL (Structured Query Language) (sql) SQLite však nebude používat vícesloupcový index, pokud použijete jednu z následujících podmínek.
1) filtrovat podle last_name pouze sloupec.
WHERE
last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)
2) filtrovat podle first_name NEBO last_name sloupce.
last_name = 'Doe' OR first_name = 'John';Code language: SQL (Structured Query Language) (sql) SQLite Zobrazit indexy
Chcete-li najít všechny indexy přidružené k tabulce, použijte následující příkaz:
PRAGMA index_list('table_name');Code language: SQL (Structured Query Language) (sql)
Tento příkaz například zobrazuje všechny indexy contacts tabulka:
PRAGMA index_list('playlist_track');Code language: SQL (Structured Query Language) (sql) Zde je výstup:
Chcete-li získat informace o sloupcích v indexu, použijte následující příkaz:
PRAGMA index_info('idx_contacts_name');Code language: SQL (Structured Query Language) (sql)
Tento příklad vrátí seznam sloupců indexu idx_contacts_name :
Dalším způsobem, jak získat všechny indexy z databáze, je dotaz z sqlite_master tabulka:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';Code language: SQL (Structured Query Language) (sql) SQLite DROP INDEX prohlášení
Chcete-li odstranit index z databáze, použijte DROP INDEX prohlášení takto:
DROP INDEX [IF EXISTS] index_name;Code language: SQL (Structured Query Language) (sql)
V této syntaxi zadáte název indexu, který chcete vypustit za DROP INDEX klíčová slova. IF EXISTS volba odstraní index pouze v případě, že existuje.
Například pomocí následujícího příkazu odeberete idx_contacts_name index:
DROP INDEX idx_contacts_name;Code language: SQL (Structured Query Language) (sql) Zkuste to
idx_contacts_name index je zcela odstraněn z databáze.
V tomto tutoriálu jste se dozvěděli o indexu SQLite a o tom, jak používat indexy ke zlepšení výkonu dotazu nebo k vynucení jedinečných omezení.