MySQL запрос и производительность - PullRequest
1 голос
/ 23 мая 2011

Хотелось бы узнать влияние на производительность, если выполнить этот запрос в следующих условиях.

Запрос:

select   `players`.*, count(`clicks`.`id`) as `clicks_count` 
from     `players` left join `clicks` on `clicks`.`player_id` = `players`.`id`
group by `players`.`id`
order by `clicks_count` desc 
limit    1

Условия:

  1. В таблице кликов, которую я ожидаю вставить 1000 раз за 1 минуту
  2. Таблица кликов будет содержать более 1 000 000 строк
  3. Таблица игроков будет содержать 10 000 строк
  4. Таблица игроков вставляется каждые 5 минут

Я хотел бы знать, чего ожидать в плане производительности, если я выполню запрос 1000 раз за 1 минуту.

Спасибо

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Этот запрос не будет никогда выполняться в миллисекундах с любыми значимыми объемами данных в ваших таблицах.Он запустит два полных сканирования таблицы, объединит их вместе, соберет беспорядок и извлечет из этого верхний ряд.

Используйте триггер для сохранения итогов в игроках и индексирования этого поля.Тогда вы сможете вообще избежать объединения:

select p.* from players p order by clicks_count desc limit 1
0 голосов
/ 23 мая 2011

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

Далее, в самом запросе выберите минимальное количество полей, необходимых для заполнения (поэтому, если вам не нужно ВСЕ поля игроков, избегайте использования «Players. *»).

Личный преф, я бы реструктурировал таблицы (например, playerID вместо id) и запросил бы так:

SELECT p.*, COUNT(c.id) as clicks_count
FROM players p
JOIN clicks c USING(playerID)
GROUP BY p.playerID
ORDER BY clicks_count desc 
LIMIT 1

Опять же, посмотрите, действительно ли вам нужны ВСЕ поля таблицы игрока; если нет, пропустите "p. *" и замените на p.foo, p.bar и т. д.

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