2015-02-02 2 views
0

Вот запрос, который занимает более 20 минут.Как я могу оптимизировать этот запрос?

SELECT * FROM company WHERE Age>5 GROUP BY Network ORDER BY Network DESC LIMIT 0,2001

У меня есть показатели по возрасту и сети. Есть ли способ сделать этот запрос более эффективным? Использование серверного языка (php) для запуска нескольких отдельных запросов является опцией.

+0

Не могли бы вы указать причину группировки данных по столбцу «Сеть»? Зачем это нужно? –

+0

... да, почему GROUP BY Network, когда вы не используете какие-либо операции группировки? (например, COUNT (*) и т. д.) –

+0

Вы пробовали использовать 'EXPLAIN' /' EXPLAIN EXTENDED' по вашему запросу? Вывод EXPLAIN может дать некоторые подсказки о том, как используются некоторые индексы. –

ответ

0

Создание составного индекса на age, network, companyid и проверить, как долго это работает:

SELECT network, min(companyid) 
FROM company 
WHERE Age > 5 
GROUP BY network; 

Это должно использовать индекс и быть достаточно быстро.

Теперь присоединиться, чтобы получить остальную информацию:

select c.* 
from company c join 
    (SELECT network, min(companyid) as mincompanyid 
     FROM company 
     WHERE Age > 5 
     GROUP BY network 
     ORDER BY network DESC 
     LIMIT 0, 2001 
    ) n 
    ON c.companyid = n.mincompanyid; 

Это предполагает company имеет первичный ключ с именем companyid и составной индекс по age, network, companyid.

EDIT:

Если первый запрос не достаточно быстро, то оценить количество строк, которые необходимо получить 2001 неповторяющихся имен. Затем выполните:

select c.* 
from company c join 
    (SELECT network, min(companyid) as mincompanyid 
     FROM (SELECT c.* 
      FROM company 
      WHERE Age > 5 
      ORDER BY network DESC 
      LIMIT 10000 
      ) c 
     GROUP BY network 
     ORDER BY network DESC 
     LIMIT 0, 2001 
    ) n 
    ON c.companyid = n.mincompanyid; 

В этом случае предполагается, что 10 000 будет достаточно большим, чтобы получить 2,001 сети. Эта версия должна исправить проблему с производительностью.

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