Резюме :в този урок ще научите как да използвате SQLite индекси за по-бързо запитване на данни, ускоряване на операцията по сортиране и налагане на уникални ограничения.
Какво е индекс?
В релационните бази данни таблицата е списък от редове. В същото време всеки ред има същата структура на колони, която се състои от клетки. Всеки ред също има последователен пореден номер на rowid, използван за идентифициране на реда. Следователно можете да разглеждате таблицата като списък с двойки:(rowid, row).
За разлика от таблицата, индексът има противоположна връзка:(ред, rowid). Индексът е допълнителна структура от данни, която помага за подобряване на производителността на заявка.
SQLite използва B-дърво за организиране на индекси. Имайте предвид, че B означава балансирано, B-дървото е балансирано дърво, а не двоично дърво.
B-дървото поддържа балансирано количеството данни от двете страни на дървото, така че броят на нивата, които трябва да бъдат преминати, за да се намери ред, винаги да е в едно и също приблизително число. Освен това, запитването с помощта на равенство (=) и диапазони (>,>=, <,<=) в индексите на B-дървото е много ефективно.
Как работи един индекс
Всеки индекс трябва да бъде свързан с конкретна таблица. Индексът се състои от една или повече колони, но всички колони на индекса трябва да са в една и съща таблица. Една таблица може да има множество индекси.
Всеки път, когато създавате индекс, SQLite създава структура на B-дърво, за да съхранява индексните данни.
Индексът съдържа данни от колоните, които сте посочили в индекса, и съответния rowid
стойност. Това помага на SQLite бързо да намери реда въз основа на стойностите на индексираните колони.
Представете си индекс в базата данни като указател на книга. Като разгледате индекса, можете бързо да идентифицирате номерата на страници въз основа на ключовите думи.
SQLite CREATE INDEX
изявление
За да създадете индекс, използвате CREATE INDEX
изявление със следния синтаксис:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);
Code language: SQL (Structured Query Language) (sql)
За да създадете индекс, посочвате три важна информация:
- Името на индекса след
CREATE INDEX
ключови думи. - Името на таблицата към индекса принадлежи.
- Списък с колони на индекса.
В случай, че искате да сте сигурни, че стойностите в една или повече колони са уникални като имейл и телефон, използвайте UNIQUE
опция в CREATE INDEX
изявление. CREATE UNIQUE INDEX
създава нов уникален индекс.
SQLite UNIQUE
пример за индекс
Нека създадем нова таблица с име contacts
за демонстрация.
CREATE TABLE contacts (
first_name text NOT NULL,
last_name text NOT NULL,
email text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Да предположим, че искате да наложите имейла да е уникален, създавате уникален индекс, както следва:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);
Code language: SQL (Structured Query Language) (sql)
Опитайте го
За да тествате това.
Първо поставете ред в contacts
таблица.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Второ, поставете друг ред с дублиран имейл.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Опитайте го
SQLite издаде съобщение за грешка, което показва, че уникалният индекс е бил нарушен. Защото, когато сте вмъкнали втория ред, SQLite провери и се увери, че имейлът е уникален за всички редове в email
от contacts
таблица.
Нека вмъкнем още два реда в contacts
таблица.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
('Lisa','Smith','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Ако потърсите данни от contacts
таблица, базирана на конкретен имейл, SQLite ще използва индекса, за да намери данните. Вижте следното изявление:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Опитайте го
За да проверите дали SQLite използва индекса или не, използвайте EXPLAIN QUERY PLAN
изявление, както следва:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Пример за многоколонен индекс на SQLite
Ако създадете индекс, който се състои от една колона, SQLite използва тази колона като ключ за сортиране. В случай, че създадете индекс, който има множество колони, SQLite използва допълнителните колони като втора, трета, ... като ключове за сортиране.
SQLite сортира данните в индекса с много колони по първата колона, посочена в CREATE INDEX
изявление. След това сортира дублираните стойности по втората колона и т.н.
Следователно редът на колоните е много важен, когато създавате индекс с няколко колони.
За да се използва индекс с няколко колони, заявката трябва да съдържа условието, което има същия ред на колоните, както е дефиниран в индекса.
Следното изявление създава индекс с много колони на first_name
и last_name
колони на contacts
таблица:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Ако потърсите contacts
таблица с едно от следните условия в WHERE
клауза, SQLite ще използва многоколонния индекс за търсене на данни.
1) филтрирайте данните по first_name
колона.
WHERE
first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
2)филтрирайте данните и по first_name
и last_name
колони:
WHERE
first_name = 'John' AND last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
Въпреки това, SQLite няма да използва многоколонния индекс, ако използвате едно от следните условия.
1)филтрирайте по last_name
само колона.
WHERE
last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
2) филтрирайте по first_name
ИЛИ last_name
колони.
last_name = 'Doe' OR first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
SQLite показване на индекси
За да намерите всички индекси, свързани с таблица, използвайте следната команда:
PRAGMA index_list('table_name');
Code language: SQL (Structured Query Language) (sql)
Например, този израз показва всички индекси на contacts
таблица:
PRAGMA index_list('playlist_track');
Code language: SQL (Structured Query Language) (sql)
Ето изхода:
За да получите информация за колоните в индекс, използвайте следната команда:
PRAGMA index_info('idx_contacts_name');
Code language: SQL (Structured Query Language) (sql)
Този пример връща списъка с колони на индекса idx_contacts_name
:
Друг начин да получите всички индекси от база данни е да направите заявка от sqlite_master
таблица:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';
Code language: SQL (Structured Query Language) (sql)
SQLite DROP INDEX
изявление
За да премахнете индекс от база данни, използвате DROP INDEX
изявление, както следва:
DROP INDEX [IF EXISTS] index_name;
Code language: SQL (Structured Query Language) (sql)
В този синтаксис указвате името на индекса, който искате да изпуснете след DROP INDEX
ключови думи. IF EXISTS
опцията премахва индекс само ако съществува.
Например, използвате следния израз, за да премахнете idx_contacts_name
индекс:
DROP INDEX idx_contacts_name;
Code language: SQL (Structured Query Language) (sql)
Опитайте го
idx_contacts_name
индексът се премахва напълно от базата данни.
В този урок научихте за индекса на SQLite и как да използвате индекси за подобряване на производителността на заявката или налагане на уникални ограничения.