¿Se necesita un índice para una clave primaria en SQLite?


130

Cuando una columna entera se marca como clave principal en una tabla SQLite, ¿también se debe crear un índice explícitamente para ella? SQLite no parece crear automáticamente un índice para una columna de clave principal, pero ¿quizás lo indexa de todos modos, dado su propósito? (Buscaré en esa columna todo el tiempo).

¿La situación sería diferente para una clave primaria de cadena?

Respuestas:


148

Lo hace por ti.

Aparte de las columnas INTEGER PRIMARY KEY, se implementan las restricciones UNIQUE y PRIMARY KEY creando un índice en la base de datos (de la misma manera que lo haría una instrucción "CREATE INDIQUE ÚNICO"). Dicho índice se usa como cualquier otro índice en la base de datos para optimizar las consultas. Como resultado, a menudo no hay ventaja (pero una sobrecarga significativa) en la creación de un índice en un conjunto de columnas que ya están colectivamente sujetas a una restricción de CLAVE ÚNICA o PRIMARIA.


8
De hecho, dice "El atributo PRIMARY KEY normalmente crea un índice ÚNICO en la columna o columnas que se especifican como PRIMARY KEY". Sin embargo, ese índice no es visible en las aplicaciones de administración de SQLite, por eso pregunté.
Marek Jedliński

1
Se menciona en la sqlite_mastertabla con un nombre que comienza con sqlite_autoindex_.
dan04

2
Tarde, pero @NicolasZozol sí, necesita crear un UNIQUEíndice (o una UNIQUErestricción) en los campos principales / referenciados si no existe; se recomienda que los campos secundarios / de referencia tengan un índice (que generalmente no será único): vea aquí
TripeHound

2
Hmm, la sección SQL Data Constraints aquí dice: En la mayoría de los casos , las restricciones ÚNICAS y PRINCIPALES se implementan creando un índice único en la base de datos. (Las excepciones son INTEGER PRIMARY KEY y PRIMARY KEYs en las tablas SIN ROWID). ¿Entonces la respuesta no siempre es cierta?
Curiosidad juguetona

3
Parece que rowid está indexado pero implementado de manera diferente sqlite.org/lang_createtable.html#rowid Los datos de las tablas rowid se almacenan como una estructura B-Tree que contiene una entrada para cada fila de la tabla, utilizando el valor rowid como clave ... para un registro con un rowid específico ... es aproximadamente dos veces más rápido que una búsqueda similar al especificar cualquier otra CLAVE PRIMARIA o valor indexado.
matreshkin

15

Si una columna está marcada INTEGER PRIMARY KEY, en realidad es aproximadamente el doble de rápido que una búsqueda similar realizada al especificar cualquier otra PRIMARY KEY o valor indexado . Esto es porque:

... todas las filas dentro de las tablas SQLite tienen una clave de entero con signo de 64 bits que identifica de forma exclusiva la fila dentro de su tabla ... La búsqueda de un registro con un rowid específico, o para todos los registros con rowids dentro de un rango especificado es aproximadamente el doble de rápido como una búsqueda similar realizada especificando cualquier otra CLAVE PRIMARIA o valor indexado.

Con una excepción a continuación, si una tabla de rowid tiene una clave primaria que consiste en una sola columna y el tipo declarado de esa columna es "INTEGER" en cualquier combinación de mayúsculas y minúsculas, entonces la columna se convierte en un alias para el rowid.

Dicha columna generalmente se denomina "clave primaria entera". Una columna PRIMARY KEY solo se convierte en una clave primaria entera si el nombre de tipo declarado es exactamente "INTEGER". Otros nombres de tipo entero como "INT" o "BIGINT" o "SHORT INTEGER" o "UNSIGNED INTEGER" hacen que la columna de clave primaria se comporte como una columna de tabla ordinaria con afinidad de enteros y un índice único, no como un alias para el rowid.

Ver: http://www.sqlite.org/lang_createtable.html#rowid


8

Una base de datos siempre creará en silencio un índice para una clave primaria única para que pueda verificar internamente que sea única de manera eficiente.

Una vez creado, lo usará cuando sea necesario.

Por supuesto, no siempre estará agrupado, y usted especifica generalmente en el esquema si lo desea.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.