2011-03-07 28 views
6

pregunta actualizada:
supongamos que los datos que me interesan son solo aquellos con campo = 1 y la relación real de datos cuando el campo es 1 vs 0 es muy pequeño (por ejemplo, 1%) en este caso, ¿indexaría el campo beneficiará mi selección donde campo = 1 consulta?indexar un campo de bit en MYSQL

pregunta original:
que tiene un campo int que tendrá ya sea 0 ó 1 Valor, sería indexar este campo velocidad para consultas de selección, tales como:

 
select * from xxx where field=1; 

Respuesta

4

En términos generales, no. Un campo biestado no acelera las consultas cuando se indexa porque tiene que mirar la mitad de las filas en promedio. Desea que sus entradas de índice sean selectivas: una entrada determinada en el índice debe representar solo un pequeño porcentaje de los valores posibles (por ejemplo, menos del 10%, preferiblemente en las fracciones de un porcentaje). Luego, usar el índice ignora la mayoría de los datos en la tabla, que es lo que le da un beneficio de rendimiento.

Algunos índices de mapa de bits de soporte DBMS. Pueden ayudar, pero aún te encuentras con el problema de la selectividad.


La pregunta actualizada dice que el número de valores con valor 1 será pequeño (menos del uno por ciento); ¿un índice le dará un beneficio ahora?

La respuesta es:

  • Para aquellas consultas que se especifica que el valor es 1, entonces sí, un índice en la columna podría proporcionar un beneficio, siempre que el optimizador en realidad hace uso del índice . Es posible que necesite modificar el DBMS para que se dé cuenta de que el índice está sesgado a favor de usarlo con consultas donde el valor es 1; esto tiende a ser específico de DBMS, pero actualizar las estadísticas en varias formas es el nombre del juego, posiblemente usando sugerencias en las consultas SQL también. Por supuesto, si el optimizador nunca usa el índice, aún no proporciona ningún beneficio, y el optimizador puede decidir que otros índices lo ayuden más de alguna manera.

  • Para aquellas consultas donde el valor es 0, el índice no debe ser utilizado. Sin embargo, lo más probable es que el DBMS continúe manteniendo el índice para los valores 0, aunque nunca debería usarlos. Sería un DBMS inusual que podría ordenarse 'solo indexar esta columna para los valores distintos de cero', aunque sería muy beneficioso.

Así que - depende. Depende de las consultas, y depende del optimizador.

Nota también que un índice compuesto - en algunas otras columnas que se usan habitualmente y luego el campo de bits también pueden proporcionar algún beneficio. Entonces, si casi siempre eliges en un rango de fechas, entonces un índice compuesto en las columnas de fecha y campo de bit (probablemente en ese orden) debería proporcionarte un buen índice.

0

Sí. Pero es posible que no desee tomar el golpe de rendimiento consecuente para las actualizaciones de un campo tan pequeño; si sus filas son 50/50 0 o 1, una exploración de tabla completa puede ser razonable.

0

Es cierto que los valores no son únicos por lo que tiene que escanear a través de todos los valores y no hay nada mejora del rendimiento de la búsqueda binaria.

Sin embargo, hay algo más a considerar. Si la base de datos es grande y no cabe en la memoria, debe cargar los datos en la memoria antes de que pueda mirar a través de ella.Si hay un índice que contiene los datos, puede ser mucho más rápido cargar solo este índice que la tabla completa. Probablemente depende de la cantidad de columnas que tenga la tabla.

Cuestiones relacionadas