Убедитесь, что у вас есть составной «покрывающий» индекс для песни: (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
.