2009-11-16 8 views
1

Этот запрос получает мне профили с наибольшим количеством доказательств, когда профиль является актером. Есть ли способ сделать это быстрее в запросе mysql?Есть ли более быстрый способ подсчета записей в соединении

SELECT profiles.*, count(*) AS counted_profiles 
FROM `profiles` 
INNER JOIN (SELECT ev.actor_id 
      FROM evidences AS ev 
      WHERE ev.actor_type = 'Profile') AS ev2 
ON ev2.actor_id = profiles.id 
GROUP BY ev2.actor_id 
ORDER BY counted_profiles DESC LIMIT 10 

ответ

0

Вы можете использовать GROUP BY, ORDER BY и LIMIT положение в подзапросе, то INNER JOIN с этим. Это просто еще один способ сделать это, но не уверен в усилении.

+0

Это был самый быстрый запрос ~ 27 раз быстрее, чем полное соединение, так как оно возвращало гораздо меньше записей в подзапросе. – james2m

4

Вы можете удалить profiles.*, удалить подзапрос, и добавить индекс для поля объединения.

Кроме того, считаю это:

SELECT ev.actor_id, count(*) AS counted_profiles 
FROM `profiles` INNER JOIN evidences AS ev 
     ON ev.actor_id = profiles.id AND ev.actor_type = 'Profile' 
GROUP BY ev.actor_id 
ORDER BY counted_profiles DESC LIMIT 10 
+0

Да. Нет необходимости использовать производную таблицу для этого запроса. Полученная таблица может быть реализована MySQL, довольно дорого. – MarkR

+0

Это сработало, но из-за размера таблицы показаний было не намного быстрее. Основной выигрыш произошел от ограничения и группировки на подборе. – james2m

Смежные вопросы