Создание составного индекса на 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 сети. Эта версия должна исправить проблему с производительностью.
Не могли бы вы указать причину группировки данных по столбцу «Сеть»? Зачем это нужно? –
... да, почему GROUP BY Network, когда вы не используете какие-либо операции группировки? (например, COUNT (*) и т. д.) –
Вы пробовали использовать 'EXPLAIN' /' EXPLAIN EXTENDED' по вашему запросу? Вывод EXPLAIN может дать некоторые подсказки о том, как используются некоторые индексы. –