2008-11-20 13 views
11

He leído que las columnas que se eligen para los índices deben discriminar bien entre las filas, es decir, las columnas de índice no deben contener una gran cantidad de filas con el mismo valor. Esto sugeriría que los booleanos o una enumeración como el género serían una mala elección para un índice.¿Utiliza columnas booleanas o enumeradas en los índices?

Pero digo que quiero encontrar usuarios por sexo y en mi base de datos particular, solo el 2% de los usuarios son mujeres, entonces en ese caso parece que la columna de género sería un índice útil para obtener las usuarias, pero no al obtener todos los usuarios masculinos.

¿En general, sería una buena idea poner un índice en dicha columna?

Respuesta

1

Este es un caso en el que permitiría que las estadísticas del servidor me informaran cuándo crear el índice. A menos que sepa que esta consulta va a predominar o que ejecutar dicha consulta no cumpliría sus objetivos de rendimiento a priori, entonces crear el índice prematuramente puede costarle rendimiento en lugar de aumentarlo. Además, es posible que desee pensar cómo utilizaría realmente la consulta. En este caso, supongo que normalmente haría algún tipo de agregación basada en esta columna en lugar de simplemente seleccionar a los usuarios que cumplen los criterios. En ese caso, realizará el escaneo de tabla de todos modos y el índice no le comprará nada.

3

Indexar una columna de cardinalidad baja para mejorar el rendimiento de búsqueda es común en mi mundo. Oracle admite un "índice de mapa de bits" que está diseñado para estas situaciones. Ver this article para una breve descripción.

La mayor parte de mi experiencia es con Oracle, pero supongo que otros RDBMS 'soportan algo similar.

2

No olvide, sin embargo, que probablemente solo seleccionará para mujeres aproximadamente el 2% del tiempo. El resto del tiempo, estarás buscando hombres. Y para eso, un escaneo de tabla directo (en lugar de un escaneo de índice más el acceso a los datos de la tabla) será más rápido.

También puede, a veces, utilizar un índice compuesto, con una columna de cardinalidad baja (enum, booleano) junto con una columna de cardinalidad más alta (fecha de nacimiento, tal vez). Esto depende mucho de la información completa y de las consultas que realmente usará.

Mi experiencia es que un índice en hombres/mujeres rara vez va a ser realmente útil. Y el consejo general es válido. Un punto más para recordar: los índices deben mantenerse cuando agrega o elimina (o actualiza) filas. Cuantos más índices, más trabajo debe hacer cada operación de modificación, desacelerando el sistema.

Hay libros enteros sobre diseño de índice.

+0

Su respuesta es buena pero considere, en lugar de género, estamos almacenando las principales ciudades o estados, que son solo 100 en número, distribuidas entre 1 millón de usuarios, por lo que probablemente 10 mil usuarios tendrán el mismo valor, y si estamos buscando solo para una ciudad en particular, entonces no quiero que DB itere 1 millón de filas, y el índice b + normal será muy malo para este propósito, entonces, ¿cuál será su sugerencia en este caso? –

+0

@Akash: vea las otras dos respuestas: un índice de mapa de bits puede ser apropiado, pero depende de cuáles sean sus consultas. ¿Está buscando devolver todos los 10,000 usuarios para una sola ciudad? ¿O estás haciendo algunas estadísticas sobre los usuarios de esa ciry? O ... –

+0

gracias por su respuesta, estoy buscando la búsqueda en una sola ciudad, pero el problema que tengo es que el servidor SQL no tiene índice de mapa de bits, no estoy seguro de que no haya visto nuevas características en la última SQL, espero que esté allí. –

Cuestiones relacionadas