OR UPPER(lu.opis) LIKE UPPER('%SomeName%')
има 3 проблема с производителността:
OR
е лошо оптимизиран. По същество таблицата трябва да се сканира, за да се проверят всички редове. Индексите едва ли ще помогнат.UPPER(indexed-column)
предотвратява използването на индекс в тази колона. Това лесно се заобикаля, като декларирате, че тази колона имаCOLLATION
което е „нечувствително към малки и главни букви“ -- тоест нещо катоutf8_unicode_ci
; обърнете внимание на_ci
.LIKE '%...
не може да използва индекс поради водещия заместващ знак.
Освен това обикновено е глупаво да има
32497 row(s) returned
Какво ще правиш с толкова много редове? Времето за мрежов трансфер ще бъде значително, дори ако самата заявка не е.
За да "решите" LIKE
, OR
и UPPER
проблеми наведнъж, съберете текста заедно в една колона в една таблица. След това предоставете FULLTEXT
индекс на тази колона. The, MATCH ... AGAINST ...
ще работи много по-бързо -- поне за извършване на SomeName
Търсене. (LEFT JOINs
са друг въпрос.)