sql >> Databáze >  >> RDS >> SQLite

Index SQLite

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í.


  1. Rozdíl mezi LIKE a =v MYSQL?

  2. Nelze se připojit k postgresovému serveru v dockeru z dockerizované aplikace

  3. Zabránit automatickému zvýšení InnoDB NA DUPLIKÁTNÍM KLÍČI

  4. GWFG v Oracle RAC