SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Índice SQLite


Resumo :neste tutorial, você aprenderá a usar índices SQLite para consultar dados mais rapidamente, acelerar a operação de classificação e aplicar restrições exclusivas.

O que é um índice?


Em bancos de dados relacionais, uma tabela é uma lista de linhas. Ao mesmo tempo, cada linha tem a mesma estrutura de colunas que consiste em células. Cada linha também tem um número de sequência rowid consecutivo usado para identificar a linha. Portanto, você pode considerar uma tabela como uma lista de pares:(rowid, row).

Ao contrário de uma tabela, um índice tem uma relação oposta:(row, rowid). Um índice é uma estrutura de dados adicional que ajuda a melhorar o desempenho de uma consulta.

SQLite usa B-tree para organizar índices. Observe que B significa balanceada, B-tree é uma árvore balanceada, não uma árvore binária.

A árvore B mantém a quantidade de dados em ambos os lados da árvore balanceada para que o número de níveis que devem ser percorridos para localizar uma linha seja sempre o mesmo número aproximado. Além disso, consultar usando igualdade (=) e intervalos (>,>=, <,<=) nos índices da árvore B são muito eficientes.

Como funciona um índice


Cada índice deve estar associado a uma tabela específica. Um índice consiste em uma ou mais colunas, mas todas as colunas de um índice devem estar na mesma tabela. Uma tabela pode ter vários índices.

Sempre que você cria um índice, o SQLite cria uma estrutura de árvore B para armazenar os dados do índice.

O índice contém dados das colunas que você especifica no índice e o rowid correspondente valor. Isso ajuda o SQLite a localizar rapidamente a linha com base nos valores das colunas indexadas.

Imagine um índice no banco de dados como um índice de um livro. Observando o índice, você pode identificar rapidamente os números das páginas com base nas palavras-chave.

SQLite CREATE INDEX declaração


Para criar um índice, você usa o CREATE INDEX declaração com a seguinte sintaxe:
CREATE [UNIQUE] INDEX index_name 
ON table_name(column_list);Code language: SQL (Structured Query Language) (sql)

Para criar um índice, você especifica três informações importantes:
  • O nome do índice após o CREATE INDEX palavras-chave.
  • O nome da tabela ao índice pertence.
  • Uma lista de colunas do índice.

Caso você queira garantir que os valores em uma ou mais colunas sejam exclusivos, como email e telefone, use o UNIQUE opção no CREATE INDEX demonstração. O CREATE UNIQUE INDEX cria um novo índice exclusivo.

SQLite UNIQUE exemplo de índice


Vamos criar uma nova tabela chamada contacts para demonstração.
CREATE TABLE contacts (
	first_name text NOT NULL,
	last_name text NOT NULL,
	email text NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Tente

Suponha que você queira impor que o email seja exclusivo, crie um índice exclusivo da seguinte maneira:
CREATE UNIQUE INDEX idx_contacts_email 
ON contacts (email);Code language: SQL (Structured Query Language) (sql)

Tente

Para testar isso.

Primeiro, insira uma linha nos contacts tabela.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');Code language: SQL (Structured Query Language) (sql)

Tente

Segundo, insira outra linha com um email duplicado.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');Code language: SQL (Structured Query Language) (sql)

Tente

O SQLite emitiu uma mensagem de erro indicando que o índice exclusivo foi violado. Porque quando você inseriu a segunda linha, o SQLite verificou e certificou-se de que o email é exclusivo entre as linhas em email dos contacts tabela.

Vamos inserir mais duas linhas nos contacts tabela.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
      ('Lisa','Smith','[email protected]');Code language: SQL (Structured Query Language) (sql)

Tente

Se você consultar dados dos contacts tabela com base em um e-mail específico, o SQLite usará o índice para localizar os dados. Veja a seguinte declaração:
SELECT
	first_name,
	last_name,
	email
FROM
	contacts
WHERE
	email = '[email protected]';Code language: SQL (Structured Query Language) (sql)

Tente

Para verificar se o SQLite usa o índice ou não, você usa o EXPLAIN QUERY PLAN declaração da seguinte forma:
EXPLAIN QUERY PLAN 
SELECT
	first_name,
	last_name,
	email
FROM
	contacts
WHERE
	email = '[email protected]';Code language: SQL (Structured Query Language) (sql)

Tente

Exemplo de índice de várias colunas SQLite


Se você criar um índice que consiste em uma coluna, o SQLite usará essa coluna como chave de classificação. Caso você crie um índice que tenha várias colunas, o SQLite usa as colunas adicionais como segunda, terceira, … como chaves de classificação.

SQLite classifica os dados no índice de várias colunas pela primeira coluna especificada no CREATE INDEX demonstração. Em seguida, ele classifica os valores duplicados pela segunda coluna e assim por diante.

Portanto, a ordem das colunas é muito importante ao criar um índice de várias colunas.

Para utilizar um índice de várias colunas, a consulta deve conter a condição que tenha a mesma ordem de coluna definida no índice.

A instrução a seguir cria um índice de várias colunas no first_name e last_name colunas dos contacts tabela:
CREATE INDEX idx_contacts_name 
ON contacts (first_name, last_name);Code language: SQL (Structured Query Language) (sql)

Tente

Se você consultar os contacts tabela com uma das seguintes condições no WHERE cláusula, o SQLite utilizará o índice de várias colunas para pesquisar dados.

1) filtrar dados pelo first_name coluna.
WHERE
	first_name = 'John';Code language: SQL (Structured Query Language) (sql)

2) filtrar dados por ambos first_name e last_name colunas:
WHERE
	first_name = 'John' AND last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)

No entanto, o SQLite não usará o índice de várias colunas se você usar uma das seguintes condições.

1) filtrar pelo last_name coluna apenas.
WHERE
	last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)

2) filtrar por first_name OU last_name colunas.
last_name = 'Doe' OR first_name = 'John';Code language: SQL (Structured Query Language) (sql)

SQLite Mostrar índices


Para encontrar todos os índices associados a uma tabela, use o seguinte comando:
PRAGMA index_list('table_name');Code language: SQL (Structured Query Language) (sql)

Por exemplo, esta instrução mostra todos os índices dos contacts tabela:
PRAGMA index_list('playlist_track');Code language: SQL (Structured Query Language) (sql)

Aqui está a saída:

Para obter as informações sobre as colunas em um índice, use o seguinte comando:
PRAGMA index_info('idx_contacts_name');Code language: SQL (Structured Query Language) (sql)

Este exemplo retorna a lista de colunas do índice idx_contacts_name :

Outra maneira de obter todos os índices de um banco de dados é consultar o sqlite_master tabela:
SELECT
   type, 
   name, 
   tbl_name, 
   sql
FROM
   sqlite_master
WHERE
   type= 'index';Code language: SQL (Structured Query Language) (sql)

SQLite DROP INDEX declaração


Para remover um índice de um banco de dados, você usa o DROP INDEX declaração da seguinte forma:
DROP INDEX [IF EXISTS] index_name;Code language: SQL (Structured Query Language) (sql)

Nesta sintaxe, você especifica o nome do índice que deseja eliminar após o DROP INDEX palavras-chave. O IF EXISTS A opção remove um índice somente se ele existir.

Por exemplo, você usa a seguinte instrução para remover o idx_contacts_name índice:
DROP INDEX idx_contacts_name;Code language: SQL (Structured Query Language) (sql)

Tente

O idx_contacts_name índice é removido completamente do banco de dados.

Neste tutorial, você aprendeu sobre o índice SQLite e como utilizar índices para melhorar o desempenho da consulta ou impor restrições exclusivas.