Question

J'ai une table 10M rangée product avec des champs comme color (int), price (float), weight (float), unitprice (int), etc ... Désormais, les utilisateurs de Web générer dynamiquement des requêtes pour rechercher des données de ce tableau avec des conditions aléatoires (la couleur est un must have ici) et par ordre tels que

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 ... ;

Comment indexer une table (InnoDB ou NDB) avec environ 10 champs de filtrage possibles (avec plage, tri ...) comme celui-ci dans MySQL?


EDIT: Dans ma compréhension MySQL très probablement choisir un seul index pour une requête, et seule la partie de la main gauche d'un indice composite fonctionnera. Il est évident que l'indexation de toutes les combinaisons possibles ne sont pas une option réalisable, comme (color, price, weight, create_date, unitprice, ....), (color, weight, price, create_date, unitprice, ....), (color, unitprice, weight, ....) .... Toutes les conditions ne sont pas nécessairement présentes dans toutes les requêtes.

Que feriez-vous pour indexer ce tableau?

Était-ce utile?

La solution

Si vous voulez LookUps rapide / filtres / sortes sur any champ, vous devez mettre les index sur tous.

Si la couleur doit avoir ist un (par exemple utilisé dans toutes les requêtes), il est préférable de faire des indices composites sur (color, field) pour chaque field que vous avez.

Mettre l'index ordonné en clusters sur (color, product_id) pourrait aussi être la peine d'essayer si color est vraiment une partie de chaque requête commune.

Autres conseils

Comme Tomalak déjà répondu, vous devriez probablement ajouter des index pour tous les champs (et des indices composites, en fonction de vos requêtes). Mais bien sûr, cela peut ralentir écrit vers le bas.

Si vous n'êtes pas sûr de la façon dont les indices seront utilisés, vous pouvez utiliser le expliquer commande .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top