OR UPPER(lu.opis) LIKE UPPER('%SomeName%')
ma 3 problemy z wydajnością:
OR
jest słabo zoptymalizowany. Zasadniczo tabelę należy przeskanować, aby sprawdzić wszystkie wiersze. Indeksy raczej nie pomogą.UPPER(indexed-column)
zapobiega używaniu indeksu w tej kolumnie. Można to łatwo obejść, aby uniknąć deklarowania, że kolumna maCOLLATION
to jest „niewrażliwe na wielkość liter” – czyli coś w rodzajuutf8_unicode_ci
; zwróć uwagę na_ci
.LIKE '%...
nie można użyć indeksu z powodu wiodącego symbol wieloznaczny.
Ponadto zwykle głupotą jest posiadanie
32497 row(s) returned
Co zamierzasz zrobić z tyloma rzędami? Czas transferu w sieci będzie znaczący, nawet jeśli samo zapytanie nie jest.
Aby „rozwiązać” LIKE
, OR
i UPPER
wszystkie problemy naraz, zbierz tekst w jednej kolumnie w jednej tabeli. Następnie podaj FULLTEXT
indeks w tej kolumnie. MATCH ... AGAINST ...
będzie działać znacznie szybciej - przynajmniej za wykonanie SomeName
Szukaj. (LEFT JOINs
to inna sprawa.)