8 Índices

Ya hemos visto algo sobre índices, cuando hablamos de las restricciones PRIMARY KEY y UNIQUE. Ahora veremos los índices en mayor detalle.

Los índices pueden ser creados en el momento de crear la tabla, ya sea mediante restricciones de columna:

sqlite> CREATE TABLE prueba(
   ...> clave INTEGER PRIMARY KEY,
   ...> texto TEXT);
sqlite> CREATE TABLE prueba2(
   ...> clave INTEGER CONTRAINT primaria PRIMARY KEY,
   ...> texto TEXT);
sqlite>

O mediante restricciones de tabla:

sqlite> CREATE TABLE prueba3(
   ...> clave INTEGER,
   ...> texto TEXT,
   ...> PRIMARY KEY (clave));
sqlite> CREATE TABLE prueba4(
   ...> clave INTEGER,
   ...> texto TEXT,
   ...> CONSTRAINT primaria PRIMARY KEY (clave));
sqlite>

La ventaja de este segundo método es que permite crear claves primaras sobre varias columnas:

sqlite> CREATE TABLE prueba5(
   ...> clave1 INTEGER,
   ...> clave2 INTEGER,
   ...> texto TEXT,
   ...> PRIMARY KEY (clave1,clave2));
sqlite>

La forma CONSTRAINT <identificador> ... permite crear identificadores para los índices asociados a la restricción. Esos identificadores se suelen usar para modificar (o alterar) las restricciones o para eliminarlas. En SQLite no les he encontrado ninguna utilidad.

Las mismas formas se pueden usar para crear claves únicas:

sqlite> CREATE TABLE prueba6(
   ...> clave INTEGER,
   ...> texto TEXT,
   ...> UNIQUE (clave));
sqlite>

Crear índices

También podemos crear índices sobre tablas existentes, o eliminarlos. Para ello disponemos de las sentencias CREATE INDEX y DROP INDEX.

sqlite> CREATE INDEX orden1 ON prueba3 (texto DESC);
sqlite> CREATE INDEX orden2 ON prueba4 (texto ASC,clave DESC);
sqlite> CREATE UNIQUE INDEX orden3 ON prueba5 (clave1 DESC);
sqlite>

Podemos usar estos índices para obtener consultas ordenadas de forma más eficiente. Si existe un índice para un orden determinado, SQLite usará ese índice, evitando el gasto de tiempo y recursos de hacer una ordenación en el momento en que se necesita.

Borrar índices

Eliminar estos índices es muy sencillo:

sqlite> DROP INDEX orden1;
sqlite>