2014-12-05 3 views
0

У меня есть таблица mySQL, где каждая запись представляет производительность игрока в конкретной покерной руке. Важными столбцами являются игрок и сеть. Я хочу создать страницу «рекордов», в которой будут показаны лучшие игроки, основанные на общем выигрыше, с возможностью фильтрации на основе типа игры, времени и т. Д. Я дружнее это с помощью следующего запроса:Ускорить запрос ранжирования

SELECT player,sum(net) AS profit FROM hands GROUP BY player ORDER BY profit DESC 

К сожалению, у меня есть много записей, более 2 миллионов даты, и этот запрос является чрезвычайно медленным. Я поместил индекс на «плеер», но время выполнения все равно 7 секунд. Есть ли надежда на ускорение mySQL или мне нужно строить эту страницу по-другому? Если последнее, любые предложения?

+0

Вам нужно отобразить всех игроков? Попробуйте добавить предложение LIMIT. – NewInTheBusiness

+0

Нет, но ограничение вообще не влияет на производительность. – Abovestand

+0

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

ответ

1

Одна возможность попробовать это:

select p.*, 
     (select sum(net) from hands h where h.player = p.player) as profit 
from players p 
order by profit desc; 

Тогда вам нужен индекс hands(player, net). Это может помочь, перемещая агрегацию в подзапрос, где он может лучше использовать индекс.

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

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