Длинное время запроса для простого выбора MySQL с JOIN - PullRequest
2 голосов
/ 07 февраля 2012
SELECT COUNT(*)
FROM song AS s
     JOIN user AS u
            ON(u.user_id = s.user_id)
WHERE s.is_active = 1 AND s.public = 1

s.active и s.public являются индексами, а также u.user_id и s.user_id.

количество строк таблицы песен 310k

количество строк таблицы пользователя 22k

Есть ли способ оптимизировать это?Мы получаем 1-секундный запрос на это.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Убедитесь, что у вас есть составной «покрывающий» индекс для песни: (user_id, is_active, public).Здесь мы назвали индекс covering_index:

SELECT COUNT(s.user_id)
FROM song s FORCE INDEX (covering_index)
JOIN user u
ON u.user_id = s.user_id
  WHERE s.is_active = 1 AND s.public = 1

Здесь мы гарантируем, что JOIN выполняется с индексом покрытия вместо первичного ключа, чтобы можно было использовать индекс покрытиядля предложения WHERE.

Я также изменил COUNT(*) на COUNT(s.user_id).Хотя MySQL должен быть достаточно умен, чтобы выбирать столбец из индекса, я на всякий случай явно назвал столбец.

Убедитесь, что на сервере настроено достаточно памяти, чтобы все ваши индексы могли оставаться в памяти.

Если у вас все еще есть проблемы, пожалуйста, опубликуйте результаты EXPLAIN.

0 голосов
/ 07 февраля 2012

Возможно, напишите это как хранимую процедуру или представление ... Вы также можете попробовать сначала выбрать все идентификаторы, а затем выполнить подсчет результата ... если вы сделаете все это одним запросом, это может быть быстрее.Как правило, оптимизация выполняется с помощью вложенных выборок или заставляет сервер выполнять свою работу, поэтому в этом контексте это все, о чем я могу думать.

SELECT Count(*) FROM 
    (SELECT song.user_id FROM
        (SELECT * FROM song WHERE song.is_active = 1 AND song.public = 1) as t
    JOIN user AS u
        ON(t.user_id = u.user_id))

Также убедитесь, что вы используете правильный тип объединения.

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