Почему поиск по нескольким словам Doctrine заставляет MySQL использовать до 300% ЦП? - PullRequest
2 голосов
/ 29 октября 2010

У меня есть таблица с использованием поиска Doctrine, которая хорошо работает для запросов с одним словом.Однако я заметил, что когда запрос содержит пробел, страница зависает, и я не могу получить ответ от обновления страницы и т. Д.

Если я открою Activity Monitor на моем Mac или SSH, тогда 'top 'в Ububntu, MySQL работает с процессором до 300% CPU.Мне нужно убить процесс, чтобы снова все нормально заработало.

Это SQL-запросы, сгенерированные Doctrine:

Для запроса одним словом:

SELECT COUNT(*) AS num_results FROM hotel h WHERE h.is_active = '1' 
AND h.id IN (SELECT id FROM hotel_index WHERE keyword = 'samui' GROUP 
BY id) 

Для запроса из нескольких слов с пробелом:

SELECT COUNT(*) AS num_results FROM hotel h WHERE h.is_active = '1' 
AND h.id IN (SELECT id FROM hotel_index WHERE id IN (SELECT id FROM 
hotel_index WHERE keyword = 'sala') AND id IN (SELECT id FROM 
hotel_index WHERE keyword = 'samui') GROUP BY id) 

Я пробовал несколько вещей, таких как добавление двойных кавычек вокруг двух слов.

Спасибо

1 Ответ

3 голосов
/ 29 октября 2010

Можно ли заставить Doctrine удалить GROUP BY из запроса?

Это не имеет смысла и только ухудшает производительность.Это будет работать намного лучше:

SELECT  COUNT(*) AS num_results
FROM    hotel h
WHERE   h.is_active = '1' 
        AND h.id IN
        (
        SELECT id
        FROM   hotel_index
        WHERE  keyword = 'sala'
        )
        AND h.id IN
        (
        SELECT id
        FROM   hotel_index
        WHERE  keyword = 'samui'
        )

, при условии, что у вас есть индексы hotel(is_active) и hotel_index (keyword)

. Вы также можете переписать его так:1013 *, который был бы еще более эффективным.

...