Как оптимизировать поисковый запрос типа LIKE in symfony (mysql)? - PullRequest
0 голосов
/ 03 августа 2020

Я тренируюсь с symfony doctrine orm, используя mysql. Текущая моя особенность - функция поиска. Введите текст и выполните поиск по столбцам email, last_name или first_name. Мне нужно много информации, поэтому мне нужно присоединиться ко многим таблицам, и вот запрос:

SELECT u0_.id AS id_0, u0_.email AS email_1, u2_.first_name AS first_name_8, 
        u2_.last_name AS last_name_9 ... (other selects)...  
FROM user u0_ 
    LEFT JOIN user_detail u2_ ON u0_.id = u2_.user_id 
    ... (other LEFT JOIN) ... 
WHERE ... (other conditions)... 
AND u0_.email LIKE '%abc@gmail.com%' 
OR u2_.first_name LIKE '%abc@gmail.com%' 
OR u2_.last_name LIKE '%abc@gmail.com%'

Но время выполнения заняло слишком много времени (~ 6 с). Я понял, что запрос выполняется медленно, возможно, из-за условий LIKE. Итак, как я могу оптимизировать производительность запроса?

1 Ответ

2 голосов
/ 04 августа 2020

Вообще говоря, вы всегда хотите избегать запуска запроса LIKE с подстановочным знаком (%).

Причина в том, что это препятствует эффективному использованию индекса. Фильтры LIKE могут использовать только символы перед первым подстановочным знаком в запросе во время обхода дерева. Это означает, что чем позже будет подстановочный знак в операторе LIKE, тем лучше будет производительность. Поэтому вам следует избегать запуска оператора LIKE с подстановочным знаком: ваш запрос не сможет использовать какой-либо индекс, поэтому он будет медленнее.

Я не знаю, можно ли избежать операторов LIKE, начинающихся с подстановочный знак в вашем конкретном случае использования, но если вы можете, вам действительно стоит.

Есть решения, чтобы избежать этого, если вам интересно. Например, вы можете адаптировать свои столбцы для использования полнотекстовой индексации и использовать запрос CONTAINS вместо LIKE для таких столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...