2013-05-21 4 views
0

Voici le scénario:MySQL - Texte intégral Recherche - Perdre index

  • MySQL
  • ont 1 MyISAM Tableau
  • Colum v.value nommé a un indice de texte intégral

La requête de base fonctionne correctement, utilise l'index comme prévu:

SELECT p.online_identifier 
FROM (...) 
WHERE r.area_id = 3 AND s.state_id= 4 
AND (snap.area_has_catalogues_attributes_id = 7028 
AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE)) 

Maintenant, lorsque j'ajoute un OU, l'index de recherche de texte intégral (sur v.value) n'est pas utilisé. Je cours Explain pour le vérifier.

La requête ressemblerait à quelque chose comme ceci:

(...) WHERE r.area_id = 3 AND s.state_id= 4 AND (snap.area_has_catalogues_attributes_id = 7028 AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE)) OR (snap.area_has_catalogues_attributes_id = 7045 AND MATCH (v.value) AGAINST('+OtherBrand' IN BOOLEAN MODE))


Je ne comprends pas pourquoi. Des idées?

Répondre

0

Voici quelque chose d'intéressant: La requête que vous avez provoque l'ignorance de l'indexation FULLTEXT. Ne t'inquiète pas, ce n'est pas ta faute. J'ai écrit à ce sujet avant: Is there a way to hint to query optimizer to MySQL which constraints should be done first?

Après avoir examiné ma réponse et ses liens suivants, maintenant, regardons à votre requête originale:

SELECT p.online_identifier 
FROM (...) 
WHERE r.area_id = 3 AND s.state_id= 4 
AND (snap.area_has_catalogues_attributes_id = 7028 
AND MATCH (v.value) AGAINST('+SomeBrand' IN BOOLEAN MODE)) 

Vous devrez exécuter la recherche FULLTEXT seul et récupérer ID uniquement.

Utilisez ces ID pour joindre les alias des autres tables.


Permettez-moi une question de l'un des my other links pour démontrer ce qu'il faut faire à votre requête

Au lieu de cette requête

select * from seeds WHERE MATCH(text) AGAINST 
("mount cameroon" IN BOOLEAN MODE) = 4; 

vous devez factoriser dans quelque chose comme ceci:

SELECT B.* FROM 
(
    SELECT id,MATCH(text) AGAINST 
    ("mount cameroon" IN BOOLEAN MODE) score 
    FROM seeds 
    WHERE MATCH(text) AGAINST 
    ("mount cameroon" IN BOOLEAN MODE) 
) A 
INNER JOIN seeds B USING (id) 
WHERE A.score = 4; 

Essayez-le!

+0

Tout d'abord, merci beaucoup pour votre aide. Il m'a guidé dans la bonne direction :) J'ai essayé votre conseil et MySQL a utilisé l'index :) Résultat: moins de lignes traitées. –

+0

Si cela ne vous dérange pas, puis-je avoir votre avis sur la question suivante? [http://stackoverflow.com/questions/16689714/mysql-analyze-query]. Il s'agit de la performance de la requête qui en résulte :) –

Questions connexes