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 INDEX
klíč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','[email protected]');
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','[email protected]');
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','[email protected]'),
('Lisa','Smith','[email protected]');
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 = '[email protected]';
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 = '[email protected]';
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í.