Оптимизировать MYSQL (3) запрос к соединению таблиц - PullRequest
1 голос
/ 31 января 2010

Выполнение EXPLAIN в некоторых моих тестах запросов приводило к медленным соединениям ALL даже с индексами.
Как сделать запрос MYSQL со следующей информацией более эффективным?

Таблица

счетчик: id (pk), отметка времени, user_id (fk)
пользователь: id (PK), имя пользователя, website_id (fk)
веб-сайт: id (pk), sitename

SELECT t2.username, t3.sitename, count(*) as views FROM counter t1
LEFT JOIN user t2 ON t2.id = t1.user_id
LEFT JOIN website t3 ON t3.id = t2.website_id
WHERE t1.id <> ""
GROUP BY t1.id
ORDER BY t1.id DESC 

Результат в HTML-таблице:

имя пользователя, sitename, counter_views

Ответы [ 3 ]

2 голосов
/ 31 января 2010

Не count(*), вместо этого используйте count(t1.id)

Вопрос Изменить Изменить

При редактировании вопроса вы должны указать название столбца в выражении подсчета того, что вы хотите считать, например, count(user.id)

Я считаю, что sql не так. Разве вы не хотите это:

select u.username, s.sitename, count(c.id)
from user u
join website s on u.website_id = s.id
join counter c on u.id = c.user_id
where u.id <> ""
group by u.username, s.sitename
order by u.id desc
1 голос
/ 31 января 2010

Ваши данные уже заполнены? Если эти таблицы пусты или очень малы, оптимизатор может выбрать запрос «все», потому что вся таблица находится на одной странице. Загрузка одной страницы с диска для получения всей таблицы происходит быстрее, чем попадание страницы на диск для индекса, а затем еще одна страница для реальной страницы данных.

0 голосов
/ 31 января 2010

Ваш запрос выглядит неправильно. Я бы использовал что-то вроде этого:

SELECT u.username, w.sitename, c.views
FROM (
  SELECT user_id, COUNT(*) AS views FROM counter GROUP BY user_id
) AS c
LEFT JOIN user u ON u.id = c.user_id
LEFT JOIN website w ON w.id = u.website_id
ORDER BY c.views DESC

Я бы тоже добавил индекс для counter.user_id.

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