Cómo indexar una tabla de consulta en MySQL
-
27-09-2019 - |
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?
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 .