Pregunta

Tengo una tabla product 10M filas con campos como color (int), price (float), weight (float), unitprice (int), etc ... Ahora, los usuarios de Web generar dinámicamente consultas para buscar datos de esta tabla con las condiciones aleatorias (el color es una necesidad aquí) y el orden por ejemplo

select * from product where color=1 and price >5 and price <220 and .... order by unitprice limit 75, 25;

select count(*) from product where color=3 and weight <500 and price <30 ... ;

Cómo indexar una tabla (InnoDB o NDB) con cerca de 10 campos posibles de filtrado (con rango, clasificación ...) de este tipo en MySQL?


EDIT: En mi MySQL comprensión más probable es que elegir sólo un índice para una consulta, y sólo la parte izquierda de un índice compuesto va a funcionar. Obviamente la indexación de todas las combinaciones posibles no es una opción viable, tal como (color, price, weight, create_date, unitprice, ....), (color, weight, price, create_date, unitprice, ....), (color, unitprice, weight, ....) .... No todas las condiciones son necesariamente presente en todas las consultas.

¿Qué haría usted para indexar esta tabla?

¿Fue útil?

Solución

Si desea que las búsquedas rápidas / filtros / tipo de cualquier campo, debe poner índices en todos ellos.

Si el color no está en una debe tener (es decir utilizan en cada consulta), lo mejor es hacer que los índices compuestos de (color, field) para cada field que tiene.

Poner el índice agrupado sobre (color, product_id) también podría valer la pena intentarlo si color es realmente una parte de cada consulta común.

Otros consejos

Como Tomalak ya ha respondido, probablemente debería añadir índices para todos los campos (y los índices compuestos, dependiendo de sus consultas). Pero por supuesto esto puede ralentizar anota.

Si no está seguro de cómo se utilizarán los índices, se puede utilizar el explicar comando .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top