2010-11-20 5 views
0

J'ai une table de plus de 2 millions de lignes (produits) avec 44 champs (colonnes). Je tente d'interroger cette table en fonction du champ 'NAME' (varchar 160) sur lequel j'ai un index fulltext.SQL Match Against Slow Query

Voici la requête qui prend actuellement 71,34 secondes à exécuter avec un mot-clé de trois mots $, 62,47 secondes avec deux mots mot-clé $ et 0,017 secondes à exécuter avec un seul mot mot-clé $. Comment puis-je optimiser cette requête pour obtenir de meilleurs résultats avec des requêtes de mot clé $ de 2 mots et plus?

+0

L'élimination de la clause "GROUP BY NAME" a amélioré les performances d'environ 4x. Les choses sont beaucoup plus rapides maintenant, mais je vais vérifier Sphinx pour améliorer encore. Merci! – user514731

Répondre

1

Cela peut ne pas être tout à fait la réponse que vous recherchez, cependant:

Avec une table que les grandes recherches en texte intégral ne vont jamais être rapide. Je suggère de regarder dans un moteur de texte intégral comme Sphinx. Comme un avantage supplémentaire, vous pouvez également faire la correspondance de pertinence dans Sphinx, car il renverra les résultats classés par ordre de pertinence. Une fois que Sphinx a renvoyé les identifiants correspondants, vous pouvez simplement insérer une instruction IN dans la clause WHERE de votre requête et sélectionner les autres données dont vous avez besoin.

Je vous suggérerais également d'examiner la syntaxe Extended Query de Sphinx, car elle vous permettra de faire correspondre plusieurs mots à travers des choses comme la proximité et l'ordre des mots.

0

Est-ce que table partioning est une option avec MySQL? Quant à SQL Server, c'est un révélateur utile dans une telle situation.

Ou peut-être de changer la fonction MATCH pour une clause standard WHERE ... LIKE. Je ne connais pas MySQL, donc je crains d'être d'une aide moindre. Pardon!