2010-07-31 19 views
101

Cuando una columna entera está marcada como clave principal en una tabla SQLite, ¿debería crearse explícitamente un índice para ella también? SQLite no parece crear automáticamente un índice para una columna de clave principal, pero tal vez lo indice de todos modos, dado su propósito. (Estaré buscando en esa columna todo el tiempo).¿Se necesita un índice para una clave principal en SQLite?

¿Sería la situación diferente para una clave primaria de cadena?

columnas

Respuesta

112

It does it for you.

CLAVE PRIMARIA INTEGER a un lado, a la vez único y clave principal restricciones se implementan mediante la creación de un índice en la base de datos (en la misma manera que un "CREATE UNIQUE INDEX" declaración haría). Tal í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 de ) al crear un índice en un conjunto de columnas que ya están colectivamente sujetas a una restricción ÚNICA o PRIMARIA.

+5

De hecho, se dice que "el atributo de clave primaria normalmente crea un índice único en la columna o columnas que se especifica como la clave principal". Sin embargo, ese índice no es visible en las aplicaciones de administración de SQLite, es por eso que pregunté. –

+1

Se menciona en la tabla 'sqlite_master' con un nombre que comienza con' sqlite_autoindex_'. – dan04

+1

Lo que significa que, a diferencia de mysql, a menudo necesita agregar índices cuando crea claves externas. Lo es ? –

7

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

Una vez creado, lo usará cuando sea necesario.

No será, por supuesto, siempre agrupado, y usted especifica generalmente en el esquema si así lo desea.

7

Si una columna está marcada INTEGER PRIMARY KEY, en realidad es alrededor de dos veces más 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 enteros de 64 bits que identifica de manera única la fila dentro de su tabla ... Búsqueda de un registro con un rowid específico o para todos los registros con rowids dentro de un rango específico es aproximadamente dos veces más rápido que una búsqueda similar realizada al especificar cualquier otra clave principal o valor indexado.

Con una excepción indica a continuación, si una tabla rowid tiene una clave principal que consta de una sola columna y el tipo declarado de que la columna es "INTEGER" en cualquier mezcla de mayúsculas y minúsculas, después la columna se convierte en un alias para el rowid.

Dicha columna se conoce generalmente como una "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 "INTEGER CORTO" o "UNSIGNED INTEGER" hacen que la columna de clave primaria se comporte como una columna de tabla ordinaria con afinidad entera y un índice único, no como un alias para el rowid.

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

Cuestiones relacionadas