OR UPPER(lu.opis) LIKE UPPER('%SomeName%')
a 3 problèmes de performances :
OR
est mal optimisé. Essentiellement, la table doit être analysée pour vérifier toutes les lignes. Il est peu probable que les index soient utiles.UPPER(indexed-column)
empêche l'utilisation d'un index sur cette colonne. Ceci est facilement contourné en déclarant que cette colonne a unCOLLATION
c'est "insensible à la casse" -- c'est-à-dire quelque chose commeutf8_unicode_ci
; notez le_ci
.LIKE '%...
impossible d'utiliser un index à cause du leading caractère générique.
De plus, il est généralement insensé d'avoir
32497 row(s) returned
Qu'allez-vous faire avec autant de lignes ? Le temps de transfert réseau sera important, même si la requête elle-même ne l'est pas.
Pour "résoudre" le LIKE
, OR
, et UPPER
tous les problèmes à la fois, rassemblez le texte dans une seule colonne d'un seul tableau. Ensuite, fournissez un FULLTEXT
index sur cette colonne. Le, MATCH ... AGAINST ...
fonctionnera beaucoup plus rapidement - au moins pour faire le SomeName
chercher. (Les LEFT JOINs
sont une autre affaire.)