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.