SQLite
 sql >> база данни >  >> RDS >> SQLite

Индекс на SQLite

Резюме :в този урок ще научите как да използвате 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 и как да използвате индекси за подобряване на производителността на заявката или налагане на уникални ограничения.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да активирате/деактивирате ограниченията на CHECK в SQLite

  2. UnsatisfiedLinkError в собствения метод

  3. Най-добри практики за работа с множество таблици

  4. Относно SQLite

  5. Мога ли да отворя база данни само за четене от папка res/asset в android, без да копирам в папка на базата данни