2010-12-04 5 views
3

La requête est grande et inclut une longue liste de tests 'LIKE' dans la clause WHERE, par exemple, ... SELECT colA FROM t O WH (colX LIKE 'mot1% mot2%' OU colX LIKE 'mot3% mot4%' OU ...);Pourquoi un mysql SELECT avec 'LIKE word% word2' dans la clause where n'utilise pas d'index

colX a un index. mysql utilise l'index car la comparaison ne commence pas par '%'. En vérifiant avec EXPLAIN, je vois que lorsque la chaîne SQL devient plus grande, mysql arrête d'utiliser l'index et commence à faire des analyses de table complètes. Il semble être lié au nombre de tests 'LIKE' dans la clause where. Au seuil, je peux ajouter un autre 'LIKE' et il arrête d'utiliser l'index et prend 10 fois plus longtemps que sans le 'LIKE' supplémentaire.

Y at-il une variable mysql qui contrôle le comportement comme ça?

+1

Et si vous réécriviez votre requête pour faire 'UNION' au lieu de' OR' s obtenez-vous toujours le même comportement? –

+0

La division en UNION entraîne l'utilisation des index. J'ai dû couper la longue liste des LIKE en trimestres pour l'utiliser, donc ça semble avoir quelque chose à voir avec le nombre de LIKE. La performance est nettement meilleure. Une idée de la raison pour laquelle l'optimiseur se comporterait beaucoup plus mal s'il y a beaucoup de LIKE? – globallyunique

Répondre

1

Je crois que si vous ajoutez FORCE INDEX [index_name], il utilisera index dans tous les cas. Vérifiez également Hint index documentation. La valeur de sysvar_max_seeks_for_key affecte également si l'index est utilisé ou non. Peut-être que changer cette valeur à un plus petit nombre aidera.