Comment optimiser les indexes avec like "%test%"

+2 votes
5,491 vues
question 8 Décembre 16 dans Sql Phpmyadmin par jarda (249 points)  

ma requête

SELECT * from table where cle like '%test%' ; # duree 1.09011 sec , lignes examinées 135115

Est ce que ça aide d'ajouter un index sur cle  ? J'ai essayé avec index dans phpmyadmin mais je ne vois pas d'amélioration

 

commentée 8 Décembre 16 par ladmin (2,277 points)  
Bonne question. Faites un tour sur la doc de Fulltext si la table est grosse et que c'est vous qui codez.
commentée 8 Décembre 16 par jarda (249 points)  
je ne code pas mais je peux retoucher les tables et les requetes si ce n'est pas trop complique. Mais Fulltext c'est complique. "test" n'est pas un mot c un masque
commentée 8 Décembre 16 par ladmin (2,277 points)  
Il n'y aura pas de solution avec un like '%ddd%'. Si ddd ne change pas beaucoup, la première requête sera lente mais les suivantes seront dans les ( très gros ) caches de mysql. Sinon, il faut redessiner la table, voire l'appli ...

1 Réponse

+6 votes
réponse 19 Décembre 16 par paco (436 points)  

index n'y changera rien. Il faut que mysql scanne toute la table quand ça commence par '%'. 

Essayez l'index full text si ce sont des mots que vous cherchez. C'est un peu compliqué, il y a des mots qu'on ne peut pas chercher et il faut changer les requêtes. Typiquement

SELECT * from table where cle like '%test%' ; 

deviendrait

SELECT * from table where MATCH(cle) AGAINST('test');

sans '%' 

commentée 19 Décembre 16 par ladmin (2,277 points)  
j'ai un peu retouché la syntaxe mais oui c'est ça. Il vaut mieux éviter cette situation ou bien alors réduire la recherche en demandant d'autres critères qui porteront mieux sur les autres clés
commentée 19 Décembre 16 par saintjoseph (192 points)  
intéressant, merci
commentée 19 Décembre 16 par danielmaillard (107 points)  
je viens d'essayer, c'est pas mal mais ça ne marche pas quand on met against('%test%')
Feel free to ask and answer in english

Bienvenue sur les FAQ de 123.fr, posez vos questions ou répondez à celles des autres usagers.

...