OR UPPER(lu.opis) LIKE UPPER('%SomeName%')
har 3 ydeevneproblemer:
OR
er dårligt optimeret. I det væsentlige skal tabellen scannes for at kontrollere alle rækker. Indekser hjælper næppe.UPPER(indexed-column)
forhindrer brug af et indeks på den kolonne. Dette er nemt at omgå at erklære den kolonne for at have enCOLLATION
det er "case-insensitive" -- det vil sige noget somutf8_unicode_ci
; bemærk_ci
.LIKE '%...
kan ikke bruge et indeks på grund af førende jokertegn.
Derudover er det normalt tåbeligt at have
32497 row(s) returned
Hvad skal du med så mange rækker? Netværksoverførselstiden vil være betydelig, selvom selve forespørgslen ikke er det.
For at "løse" LIKE
, OR
og UPPER
problemer på én gang, samle teksten sammen i en enkelt kolonne i en enkelt tabel. Angiv derefter en FULLTEXT
indeks på den kolonne. Den, MATCH ... AGAINST ...
vil køre meget hurtigere -- i det mindste for at udføre SomeName
Søg. (De LEFT JOINs
er en anden sag.)