2009-12-22 8 views
7

Estaba trabajando en una aplicación web y descubrí que la mayoría de las tablas mysql tienen campos, como is_live, can_do, required, published (y muchos más) que tienen el tipo de campo TINYINT, y toma 0 or 1 solamente. Me preguntaba si necesito crear índices en estas columnas ya que las secuencias de comandos usan combinaciones que también incluyen estas columnas. Entonces las preguntas son:¿Debo crear índices en tipos de campo tinyint en tablas mysql?

¿Debo agregar índices a estas columnas también?

¿Debo cambiar el tipo a cualquier otro tema?

Por favor, vea que esta pregunta tiene más que ver con la comprensión del concepto que con la solución de un problema.

Gracias.

Respuesta

6

Mi gurú base de datos dice, "Nunca añada ningún índice si usted no sabe la consulta". En su caso, parece que sí conoce la consulta. Entonces sí, podemos pensar en el índice. En caso de que tenga un tipo de sistema de depósito de datos, cree un índice de mapa de bits. de lo contrario, no crees ningún índice. Los índices de árbol B son malos en columnas de cardinalidad tan pequeñas.

0

Dudo que estos campos se usen en combinaciones ya que toman 0 o 1 como entrada.

El uso principal de un índice en este caso sería la capacidad de recuperar los datos directamente del índice, pero como el índice sería bastante grande, la sobrecarga probablemente lo haría ineficaz.

Sin embargo, el único enfoque válido aquí es probar en su conjunto de datos, ya que los datos que está utilizando pueden tener un impacto significativo en el resultado.

0

No creo que deba agregar índices a estos campos porque no contienen datos diferentes y muchos. Sin embargo, en cuanto al tipo de campos, puede considerar enum tipo.

+0

¿De qué sirve usar enum en este caso? –

+0

@Peter, para los campos que se supone que tienen un conjunto fijo de valores como 0 o 1, es mejor o más bien el tipo de enum de uso convencional. – Sarfraz

+0

¿qué hay de BOOL? – user187580

-1

de decidir si el índice o no, no debería depender del tipo de datos, pero en

  • qué frecuencia va a buscar el campo
  • el número de registros de la tabla tendrá (orden de magnitud)
  • si la espera de la consulta no indexada (escaneo completo de tabla) es aceptable para el usuario
+0

cardinalidad también es importante, y los tipos de datos implican algo acerca de la cardinalidad de su columna. –

17

El consejo general es que un índice en el campo booleano rara vez va a ser útil.

Los índices de árbol B son más efectivos para datos de alta cardinalidad (es decir, columnas con muchos valores posibles, donde los datos en la columna son únicos o casi únicos).

Algunos motores de base de datos, como Oracle y Postgres, son compatibles con Bitmap Indexes. Se ha considerado tradicionalmente que los índices de mapa de bits funcionan bien para datos como el género (masculino o femenino), que tiene un pequeño número de valores distintos, pero con muchas ocurrencias de esos valores.

MySQL actualmente no es compatible con los índices de mapa de bits, pero puede lograr una funcionalidad similar con su función "index_merge". Los índices de mapa de bits deben introducirse con el motor Falcon (Source).

+0

¿Quieres decir que debería cambiar a BOOL desde TINYINT? – user187580

+0

No, eso no ayudará. –

+0

+1 para la información de índices de mapa de bits. Gracias, no lo sabía. –

Cuestiones relacionadas