2017-09-06 2 views
1

J'utilise fulltext dans MySQL J'ai besoin de sélectionner deux champs dans deux tables différentes Et aussi la priorité de recherche avec le champ de nom dans le premier tableau. C'est pourquoi j'ai multiplié le résultat par 2 en triant. Et c'est un bon spectacle excentrique. Mais il y a un problème avec trop de temps, et dans certains cas environ 30 secondes. Quels changements dois-je faire pour augmenter la vitesse de cette requête?Comment accélérer la recherche sur MYSQL FullText ou modifier la requête

Note:

ft_stopword_file = ""

ft_min_word_len = 1

Le nombre d'enregistrements de chaque table est 200.000

requête:

$search="hello* my* name* in* prim* this* in* a* test*" 

SELECT f.id, f.name FROM 
Find f left join Movie m on f.`tID`=m.`id` 
WHERE MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE) 
ORDER BY MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE) + 
(MATCH(f.`name`) AGAINST('$search' IN BOOLEAN MODE) *2) DESC , length(f.Address) 
LIMIT 30 

Répondre

0

Essayez de déplacer 2 MATCH -es notre de ORDER BY ainsi que sur WHERE dans la liste principale des champs SELECT à être réutilisée plus tard:

$search="hello* my* name* in* prim* this* in* a* test*" 

SELECT 
    f.id, f.name, 
    MATCH(f.`name`,m.`text`) AGAINST('$search') as relevance1, 
    (MATCH(f.`name`) AGAINST('$search') *2) as relevance2 
FROM 
Find f left join Movie m on f.`tID`=m.`id` 
WHERE MATCH(f.`name`,m.`text`) AGAINST('$search' IN BOOLEAN MODE) 
ORDER BY relevance1 + relevance2 DESC , length(f.Address) 
LIMIT 30 

Le mandrin de code ci-dessus est juste l'idée, je ne peux pas vérifier qu'il s'exécute sans erreurs car je n'ai pas votre schéma + données. Alors jouez avec et voyez si vous pouvez le faire fonctionner. Puis comparez les plans d'exécution de votre code original et celui-ci. Je pense qu'il devrait y avoir une augmentation des performances.

En outre, vous ne devriez pas utiliser IN BOOLEAN MODE pour la pertinence utilisée dans ORDER BY si vous voulez obtenir de vraies données de pertinence. IN BOOLEAN MODE retournera toujours la pertinence de 1.0 s'il y a une correspondance. Mais dans WHERE j'utiliserais match dans IN BOOLEAN MODE.

HTH

PS. Une autre idée consiste à calculer la correspondance par f.name et m.text séparément, puis de créer les variables relevance1 et relevance2 appropriées et de les utiliser dans WHERE et ORDER BY.

+0

merci pour la réponse, mais cette requête a une erreur "Colonne inconnue 'pertinence1' dans 'where clause'" – AmirHadi

+0

oui, signifie que vous ne pouvez pas faire référence MATCH à partir de la liste de sélection dans WHERE. Vous devez donc appeler MATCH complet à l'endroit où, mais voyez si vous pouvez au moins réutiliser pertinence1 et pertinence2 dans ORDERY BY. – andrews

+0

Merci beaucoup C'était beaucoup plus rapide qu'avant – AmirHadi