¿Diferencias entre INDEX, PRIMARY, UNIQUE, FULLTEXT en MySQL?

Respuestas:

674

Las diferencias

  • KEY o INDEX se refiere a un índice normal no único. Se permiten valores no distintos para el índice, por lo que el índice puede contener filas con valores idénticos en todas las columnas del índice. Estos índices no imponen restricciones a sus datos, por lo que se usan solo para acceder, para alcanzar rápidamente ciertos rangos de registros sin escanear todos los registros.

  • ÚNICO se refiere a un índice donde todas las filas del índice deben ser únicas. Es decir, la misma fila puede no tener valores idénticos no NULL para todas las columnas de este índice como otra fila. Además de usarse para alcanzar rápidamente ciertos rangos de registros, los índices ÚNICOS se pueden usar para imponer restricciones en los datos, porque el sistema de base de datos no permite que se rompan las reglas de valores distintos al insertar o actualizar datos.

    Su sistema de base de datos puede permitir que se aplique un índice ÚNICO a columnas que permiten valores NULL, en cuyo caso se permite que dos filas sean idénticas si ambas contienen un valor NULL (la razón aquí es que NULL se considera no igual a sí mismo). Sin embargo, dependiendo de su aplicación, puede encontrar esto indeseable: si desea evitar esto, debe rechazar los valores NULL en las columnas relevantes.

  • PRIMARY actúa exactamente como un índice ÚNICO, excepto que siempre se llama 'PRIMARY', y puede haber solo uno en una tabla (y siempre debe haber uno; aunque algunos sistemas de bases de datos no aplican esto). Un índice PRIMARIO pretende ser el medio principal para identificar de forma exclusiva cualquier fila de la tabla, por lo que, a diferencia de UNIQUE, no debe usarse en ninguna columna que permita valores NULL. Su índice PRIMARIO debe estar en el menor número de columnas que sean suficientes para identificar de forma exclusiva una fila. A menudo, esta es solo una columna que contiene un número único autoincrementado, pero si hay algo más que pueda identificar de manera única una fila, como "código de país" en una lista de países, puede usar eso en su lugar.

    Algunos sistemas de bases de datos (como InnoDB de MySQL) almacenarán los registros de una tabla en el disco en el orden en que aparecen en el índice PRIMARIO.

  • Los índices FULLTEXT son diferentes de todos los anteriores, y su comportamiento difiere significativamente entre los sistemas de bases de datos. Los índices FULLTEXT solo son útiles para búsquedas de texto completo realizadas con la cláusula MATCH () / AGAINST (), a diferencia de las tres anteriores, que generalmente se implementan internamente utilizando b-trees (que permiten seleccionar, ordenar o rangos comenzando desde la columna más a la izquierda) o tablas hash (que permiten la selección a partir de la columna más a la izquierda).

    Cuando los otros tipos de índice son de propósito general, un índice FULLTEXT está especializado, ya que sirve para un propósito limitado: solo se usa para una función de "búsqueda de texto completo".

Similitudes

  • Todos estos índices pueden tener más de una columna en ellos.

  • Con la excepción de FULLTEXT, el orden de las columnas es significativo: para que el índice sea útil en una consulta, la consulta debe usar columnas del índice que comiencen desde la izquierda; no puede usar solo la segunda, tercera o cuarta parte de un índice, a menos que también esté utilizando las columnas anteriores en el índice para hacer coincidir los valores estáticos. (Para que un índice FULLTEXT sea útil para una consulta, la consulta debe usar todas las columnas del índice).

thomasrutter
fuente
2
¿Significa esto que un índice FULLTEXT es esencialmente inútil y una cintura de espacio si no utiliza MATCH () / AGAINST () en sus consultas?
user1397417
55
Si. También se usa solo para bases de datos MyISAM en MySQL, no InnoDB. Otros servidores de bases de datos pueden tener características equivalentes que pueden funcionar de manera diferente.
thomasrutter
"no debe usarse en ninguna columna que permita valores NULL" -> Esto debe ser "no se puede usar". Las claves primarias son necesariamente NOT NULL. MySQL informará show columnsque una clave única no NULL es una clave primaria, si no hay otras claves primarias definidas.
Gordon Linoff
1
La razón aquí es que NULL se considera no igual a sí mismo. Lol, no lo olvidaré
Hos Mercury
2
@thomasrutter MySQL admite FULLTEXT en InnoDB desde la versión 5.6
Marek Skiba
151

Todos estos son tipos de índices.

primario: debe ser único, es un índice, es (probablemente) el índice físico, puede ser solo uno por tabla.

Único: como dice. No puede tener más de una fila con una tupla de este valor. Tenga en cuenta que, dado que una clave única puede estar sobre más de una columna, esto no significa necesariamente que cada columna individual en el índice sea única, sino que cada combinación de valores en estas columnas es única.

índice: si no es primario o único, no restringe los valores insertados en la tabla, pero sí permite buscarlos de manera más eficiente.

texto completo: una forma más especializada de indexación que permite la búsqueda de texto completo. Piense en ello como (esencialmente) creando un "índice" para cada "palabra" en la columna especificada.

tpdi
fuente
32
Los primarios pueden ser compuestos, es decir, de múltiples claves, en MySQL (y muchos otros DB). Son solo un índice especial. Unique no es realmente un índice, es una restricción (que requiere un índice para imponerse en cantidades razonables de tiempo, por lo tanto, crea uno).
MBCook 02 de
19

Siento que esto ha sido bien cubierto, tal vez a excepción de lo siguiente:

  • Simple KEY/ INDEX(o llamado de otro modo SECONDARY INDEX) aumenta el rendimiento si la selectividad es suficiente. Sobre este asunto, la recomendación habitual es que si la cantidad de registros en el conjunto de resultados en el que se aplica un índice excede el 20% de la cantidad total de registros de la tabla primaria, entonces el índice será ineficaz. En la práctica, cada arquitectura será diferente, pero la idea sigue siendo correcta.

  • Los índices secundarios (y eso es muy específico de mysql) no deben verse como objetos completamente separados y diferentes de la clave primaria. De hecho, ambos deben usarse conjuntamente y, una vez que se conozca esta información, proporcionar una herramienta adicional al DBA mysql: en Mysql, los índices incrustan la clave primaria. Conduce a mejoras significativas en el rendimiento, específicamente cuando se construyen inteligentemente índices de cobertura implícitos como se describe allí

  • Si cree que sus datos deberían serlo UNIQUE, use un índice único. Puede pensar que es opcional (por ejemplo, resolverlo a nivel de aplicación) y que un índice normal funcionará, pero en realidad representa una garantía para Mysql de que cada fila es única, lo que incidentalmente proporciona un beneficio de rendimiento.

  • Solo puede usar FULLTEXT(o de otro modo llamado SEARCH INDEX) con Innodb (en MySQL 5.6.4 y versiones posteriores) y Myisam Engines

  • Sólo se puede utilizar FULLTEXTen CHAR, VARCHARy TEXTtipos de columna
  • FULLTEXTindex implica MUCHO más que solo crear un índice. Hay un montón de tablas de sistema creadas, un sistema de almacenamiento en caché completamente separado y algunas reglas y optimizaciones específicas aplicadas. Ver http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html y http://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html
Sebas
fuente