Ако трябва да използвате WHERE
в стил на regexp клаузи, определено ще бъдете измъчвани от проблеми с бавните заявки. За да работи търсенето в стил на regexp, MySQL трябва да сравни всяка стойност в колоната с вашето име с регулярния израз. И вашата заявка удвои проблемите, като разгледа и колоната ви с потребителско име.
Това означава, че MySQL не може да се възползва от никакви индекси, което е начинът, по който всички СУБД ускоряват заявките на големи таблици.
Има няколко неща, които можете да опитате. Всички те включват сбогуване с REGEXP.
Едното е това:
WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')
Ако създавате индекси в колоните за вашето име и потребителско име, това трябва да бъде прилично бързо. Той ще търси всички имена/потребителски имена, започващи с 'jack'. ЗАБЕЛЕЖЕТЕ, че
WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */
ще търси имена, завършващи с 'jack', но ще бъде бавно като търсенето в стил на регулярни изрази.
Друго нещо, което можете да направите, е да разберете защо приложението ви трябва да може да търси част от име или потребителско име. Можете или да премахнете тази функция от приложението си, или да измислите по-добър начин да се справите с нея.
Възможни по-добри начини:
- Помолете потребителите си да разделят имената си на полета за дадено име и фамилия и да търсят отделно.
- Създайте отделна функция „търсене във всички потребители“, която се използва само когато потребителят има нужда от нея, като по този начин намалява честотата на вашата бавна заявка в стил на регулярни изрази.
- Сами разбийте имената им в отделна таблица с имена и думи, като използвате някаква програма за предварителна обработка. Търсете в таблицата с имена и думи без регулярни изрази.
- Разберете как да използвате пълнотекстово търсене на MySQL за тази функция.
Всичко това включва известна работа по програмиране.