OR UPPER(lu.opis) LIKE UPPER('%SomeName%')
har 3 prestandaproblem:
OR
är dåligt optimerad. I huvudsak måste tabellen skannas för att kontrollera alla rader. Index kommer sannolikt inte att hjälpa.UPPER(indexed-column)
förhindrar att ett index används i den kolumnen. Detta är lätt att komma runt att förklara att kolumnen har enCOLLATION
som är "skiftlägesokänslig" -- det vill säga något somutf8_unicode_ci
; notera_ci
.LIKE '%...
kan inte använda ett index på grund av ledande jokertecken.
Dessutom brukar det vara dumt att ha
32497 row(s) returned
Vad ska du göra med så många rader? Nätverksöverföringstiden kommer att vara betydande, även om själva frågan inte är det.
För att "lösa" LIKE
, OR
och UPPER
problem på en gång, samla ihop texten till en enda kolumn i en enda tabell. Ange sedan en FULLTEXT
index på den kolumnen. Den, MATCH ... AGAINST ...
kommer att köras mycket snabbare -- åtminstone för att göra SomeName
Sök. (LEFT JOINs
är en annan sak.)