¿Diferencias entre ÍNDICE, PRIMARIO, ÚNICO, TEXTO COMPLETO en MySQL?

Resuelto asked hace 15 años • 0 respuestas

¿Cuáles son las diferencias entre PRIMARIO, ÚNICO, ÍNDICE y TEXTO COMPLETO al crear tablas MySQL?

¿Cómo los usaría?

 avatar Apr 02 '09 07:04
Aceptado

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 ninguna restricción a sus datos, por lo que se utilizan únicamente para el acceso: 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, es posible que una fila no tenga valores no NULL idénticos para todas las columnas de este índice que otra fila. Además de usarse para alcanzar rápidamente ciertos rangos de registros, los índices UNIQUE se pueden usar para imponer restricciones a los datos, porque el sistema de base de datos no permite que se rompa la regla 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 no se considera igual a sí mismo). Sin embargo, dependiendo de su aplicación, esto puede resultarle indeseable: si desea evitarlo, debe no permitir valores NULL en las columnas relevantes.

  • PRIMARIO actúa exactamente como un índice ÚNICO, excepto que siempre se llama 'PRIMARIO' y puede haber solo uno en una tabla (y siempre debería haber uno; aunque algunos sistemas de bases de datos no exigen esto). Un índice PRIMARY está pensado como un medio principal para identificar de forma única 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 la menor cantidad de columnas que sean suficientes para identificar de forma única una fila. A menudo, esto es solo una columna que contiene un número único incrementado automáticamente, 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 usarlo en su lugar.

    Algunos sistemas de bases de datos (como InnoDB de MySQL) almacenarán internamente los registros reales de una tabla dentro del índice del árbol B de PRIMARY KEY.

  • 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 los tres anteriores, que generalmente se implementan internamente usando árboles b (lo que permite seleccionar, ordenar o rangos comenzando desde la columna más a la izquierda) o tablas hash (que permiten la selección comenzando desde la columna más a la izquierda).

    Mientras que los otros tipos de índice son de propósito general, un índice de TEXTO COMPLETO está especializado, ya que tiene un propósito específico: solo se usa para una función de "búsqueda de texto completo".

Similitudes

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

  • Con la excepción de FULLTEXT, el orden de las columnas es importante: para que el índice sea útil en una consulta, la consulta debe usar columnas del índice comenzando 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 del índice para hacer coincidir valores estáticos. (Para que un índice FULLTEXT sea útil para una consulta, la consulta debe utilizar todas las columnas del índice).

thomasrutter avatar Apr 02 '2009 06:04 thomasrutter

Todos estos son tipos de índices.

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

único: como dice. No puedes tener más de una fila con una tupla de este valor. Tenga en cuenta que, dado que una clave única puede estar en más de una columna, esto no significa necesariamente que cada columna individual del í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 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) crear un "índice" para cada "palabra" en la columna especificada.

tpdi avatar Apr 02 '2009 00:04 tpdi

Siento que esto se ha cubierto bien, tal vez excepto por lo siguiente:

  • Simple KEY/ INDEX(o llamado de otro modo SECONDARY INDEX) aumenta el rendimiento si la selectividad es suficiente. En este sentido, la recomendación habitual es que si la cantidad de registros en el conjunto de resultados sobre el que se aplica un índice excede el 20% de la cantidad total de registros de la tabla principal, 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 principal. De hecho, ambos deberían usarse conjuntamente y, una vez conocida esta información, proporcionar una herramienta adicional al DBA de mysql: en Mysql, los índices incrustan la clave principal. Conduce a mejoras significativas en el rendimiento, específicamente cuando se construyen inteligentemente índices de cobertura implícitos como los que se describen allí .

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

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

  • Solo puedes usar FULLTEXTen CHARy tipos de VARCHARcolumnasTEXT

  • FULLTEXTindex implica MUCHO más que simplemente crear un índice. Se crean un montón de tablas del sistema, un sistema de almacenamiento en caché completamente separado y se aplican algunas reglas y optimizaciones específicas. Consulte 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 avatar Jan 19 '2016 01:01 Sebas