OR UPPER(lu.opis) LIKE UPPER('%SomeName%')
heeft 3 prestatieproblemen:
OR
is slecht geoptimaliseerd. In wezen moet de tabel worden gescand om alle rijen te controleren. Indexen zullen waarschijnlijk niet helpen.UPPER(indexed-column)
voorkomt het gebruik van een index op die kolom. Dit is gemakkelijk te omzeilen door die kolom een COLLATION
te geven dat is "hoofdlettergevoelig" -- dat wil zeggen, zoiets alsutf8_unicode_ci
; let op de_ci
.LIKE '%...
kan geen index gebruiken vanwege de voorloop jokerteken.
Bovendien is het meestal dwaas om
32497 row(s) returned
Wat ga je doen met zoveel rijen? De netwerkoverdrachtstijd zal aanzienlijk zijn, zelfs als de zoekopdracht zelf dat niet is.
Om de LIKE
. op te lossen , OR
, en UPPER
problemen allemaal tegelijk, verzamel de tekst samen in een enkele kolom in een enkele tabel. Geef dan een FULLTEXT
index op die kolom. De, MATCH ... AGAINST ...
zal een stuk sneller werken -- tenminste voor het uitvoeren van de SomeName
zoeken. (De LEFT JOINs
zijn een andere zaak.)