sql >> Base de Datos >  >> RDS >> SQLite

Índice SQLite

Resumen :en este tutorial, aprenderá a usar índices de SQLite para consultar datos más rápido, acelerar la operación de clasificación y aplicar restricciones únicas.

¿Qué es un índice?

En las bases de datos relacionales, una tabla es una lista de filas. Al mismo tiempo, cada fila tiene la misma estructura de columna que consta de celdas. Cada fila también tiene un número de secuencia de ID de fila consecutivo que se usa para identificar la fila. Por lo tanto, puede considerar una tabla como una lista de pares:(rowid, fila).

A diferencia de una tabla, un índice tiene una relación opuesta:(row, rowid). Un índice es una estructura de datos adicional que ayuda a mejorar el rendimiento de una consulta.

SQLite usa B-tree para organizar índices. Tenga en cuenta que B significa equilibrado, B-tree es un árbol equilibrado, no un árbol binario.

El árbol B mantiene equilibrada la cantidad de datos en ambos lados del árbol, de modo que el número de niveles que deben atravesarse para ubicar una fila sea siempre el mismo número aproximado. Además, las consultas con igualdad (=) y rangos (>,>=, <,<=) en los índices del árbol B son muy eficientes.

Cómo funciona un índice

Cada índice debe estar asociado a una tabla específica. Un índice consta de una o más columnas, pero todas las columnas de un índice deben estar en la misma tabla. Una tabla puede tener varios índices.

Cada vez que crea un índice, SQLite crea una estructura de árbol B para contener los datos del índice.

El índice contiene datos de las columnas que especificas en el índice y el correspondiente rowid valor. Esto ayuda a SQLite a ubicar rápidamente la fila en función de los valores de las columnas indexadas.

Imagine un índice en la base de datos como el índice de un libro. Al mirar el índice, puede identificar rápidamente los números de página en función de las palabras clave.

SQLite CREATE INDEX declaración

Para crear un índice, utiliza el CREATE INDEX declaración con la siguiente sintaxis:

CREATE [UNIQUE] INDEX index_name 
ON table_name(column_list);Code language: SQL (Structured Query Language) (sql)

Para crear un índice, especifica tres información importante:

  • El nombre del índice después de CREATE INDEX palabras clave.
  • El nombre de la tabla a la que pertenece el índice.
  • Una lista de columnas del índice.

En caso de que desee asegurarse de que los valores en una o más columnas sean únicos, como el correo electrónico y el teléfono, use el UNIQUE opción en CREATE INDEX declaración. El CREATE UNIQUE INDEX crea un nuevo índice único.

SQLite UNIQUE ejemplo de índice

Vamos a crear una nueva tabla llamada contacts para demostración.

CREATE TABLE contacts (
	first_name text NOT NULL,
	last_name text NOT NULL,
	email text NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Pruébalo

Supongamos que desea hacer cumplir que el correo electrónico es único, crea un índice único de la siguiente manera:

CREATE UNIQUE INDEX idx_contacts_email 
ON contacts (email);Code language: SQL (Structured Query Language) (sql)

Pruébalo

Para probar esto.

Primero, inserte una fila en los contacts mesa.

INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');Code language: SQL (Structured Query Language) (sql)

Pruébalo

En segundo lugar, inserte otra fila con un correo electrónico duplicado.

INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');Code language: SQL (Structured Query Language) (sql)

Pruébalo

SQLite emitió un mensaje de error que indica que se ha violado el índice único. Porque cuando insertó la segunda fila, SQLite verificó y se aseguró de que el correo electrónico sea único en todas las filas en email de los contacts mesa.

Insertemos dos filas más en los contacts mesa.

INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
      ('Lisa','Smith','[email protected]');Code language: SQL (Structured Query Language) (sql)

Pruébalo

Si consulta datos de los contacts tabla basada en un correo electrónico específico, SQLite usará el índice para ubicar los datos. Ver la siguiente declaración:

SELECT
	first_name,
	last_name,
	email
FROM
	contacts
WHERE
	email = '[email protected]';Code language: SQL (Structured Query Language) (sql)

Pruébalo

Para verificar si SQLite usa el índice o no, usa el EXPLAIN QUERY PLAN declaración de la siguiente manera:

EXPLAIN QUERY PLAN 
SELECT
	first_name,
	last_name,
	email
FROM
	contacts
WHERE
	email = '[email protected]';Code language: SQL (Structured Query Language) (sql)

Pruébalo

Ejemplo de índice de varias columnas de SQLite

Si crea un índice que consta de una columna, SQLite usa esa columna como clave de ordenación. En caso de que cree un índice que tenga varias columnas, SQLite usa las columnas adicionales como la segunda, tercera,... como claves de ordenación.

SQLite ordena los datos en el índice de varias columnas por la primera columna especificada en CREATE INDEX declaración. Luego, ordena los valores duplicados por la segunda columna y así sucesivamente.

Por lo tanto, el orden de las columnas es muy importante cuando crea un índice de varias columnas.

Para utilizar un índice de varias columnas, la consulta debe contener la condición que tiene el mismo orden de columnas definido en el índice.

La siguiente declaración crea un índice de varias columnas en el first_name y last_name columnas de los contacts tabla:

CREATE INDEX idx_contacts_name 
ON contacts (first_name, last_name);Code language: SQL (Structured Query Language) (sql)

Pruébalo

Si consulta los contacts tabla con una de las siguientes condiciones en el WHERE cláusula, SQLite utilizará el índice de varias columnas para buscar datos.

1) filtrar datos por first_name columna.

WHERE
	first_name = 'John';Code language: SQL (Structured Query Language) (sql)

2) filtrar datos por ambos first_name y last_name columnas:

WHERE
	first_name = 'John' AND last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)

Sin embargo, SQLite no usará el índice de varias columnas si usa una de las siguientes condiciones.

1) filtrar por el last_name solo columna.

WHERE
	last_name = 'Doe';Code language: SQL (Structured Query Language) (sql)

2) filtrar por first_name O last_name columnas.

last_name = 'Doe' OR first_name = 'John';Code language: SQL (Structured Query Language) (sql)

SQLite Mostrar índices

Para encontrar todos los índices asociados con una tabla, utilice el siguiente comando:

PRAGMA index_list('table_name');Code language: SQL (Structured Query Language) (sql)

Por ejemplo, esta declaración muestra todos los índices de los contacts tabla:

PRAGMA index_list('playlist_track');Code language: SQL (Structured Query Language) (sql)

Aquí está la salida:

Para obtener la información sobre las columnas en un índice, utilice el siguiente comando:

PRAGMA index_info('idx_contacts_name');Code language: SQL (Structured Query Language) (sql)

Este ejemplo devuelve la lista de columnas del índice idx_contacts_name :

Otra forma de obtener todos los índices de una base de datos es consultar desde el sqlite_master tabla:

SELECT
   type, 
   name, 
   tbl_name, 
   sql
FROM
   sqlite_master
WHERE
   type= 'index';Code language: SQL (Structured Query Language) (sql)

SQLite DROP INDEX declaración

Para eliminar un índice de una base de datos, utilice el DROP INDEX declaración de la siguiente manera:

DROP INDEX [IF EXISTS] index_name;Code language: SQL (Structured Query Language) (sql)

En esta sintaxis, especifica el nombre del índice que desea colocar después de DROP INDEX palabras clave El IF EXISTS La opción elimina un índice solo si existe.

Por ejemplo, usa la siguiente declaración para eliminar el idx_contacts_name índice:

DROP INDEX idx_contacts_name;Code language: SQL (Structured Query Language) (sql)

Pruébalo

El idx_contacts_name index se elimina por completo de la base de datos.

En este tutorial, ha aprendido sobre el índice SQLite y cómo utilizar los índices para mejorar el rendimiento de la consulta o aplicar restricciones únicas.