OR UPPER(lu.opis) LIKE UPPER('%SomeName%')
má 3 problémy s výkonem:
OR
je špatně optimalizovaný. V zásadě musí být tabulka naskenována, aby se zkontrolovaly všechny řádky. Indexy pravděpodobně nepomohou.UPPER(indexed-column)
zabrání použití indexu v tomto sloupci. To lze snadno vyřešit deklarací tohoto sloupce jakoCOLLATION
to "nerozlišuje malá a velká písmena" - to znamená něco jakoutf8_unicode_ci
; všimněte si_ci
.LIKE '%...
nelze použít index kvůli začátku zástupný znak.
Navíc je obvykle pošetilé mít
32497 row(s) returned
Co budeš dělat s tolika řádky? Doba síťového přenosu bude značná, i když samotný dotaz není.
Chcete-li "vyřešit" LIKE
, OR
a UPPER
problémy najednou, shromážděte text do jednoho sloupce v jedné tabulce. Poté zadejte FULLTEXT
index v tomto sloupci. MATCH ... AGAINST ...
poběží mnohem rychleji – alespoň pro provedení SomeName
Vyhledávání. (LEFT JOINs
jsou jiná věc.)