Попробуйте это:
SELECT token, GROUP_CONCAT(source), SUM(count)
FROM TokenFrequency
GROUP BY token;
Это должно работать намного быстрее, а также устранять дубликаты. Но источники будут возвращены в списке через запятую, поэтому вам придется взорвать его в своем приложении.
Вы также можете попытаться создать составной индекс по столбцам token, source, count
(в этом порядке) и проанализировать с помощью EXPLAIN
, чтобы увидеть, достаточно ли у MySQL достаточно умного, чтобы использовать его в качестве покрывающего индекса для этого запрос.
обновление: Кажется, я неправильно понял ваш вопрос. Вам не нужна сумма подсчетов для каждого токена, вам нужна сумма отсчетов для каждой пары источников для данного токена.
Я считаю, что внутреннее соединение - лучшее решение для этого. Важное указание для SQL заключается в том, что если вам нужно вычислить выражение для двух разных строк, вам нужно выполнить соединение.
Однако один из методов оптимизации, о котором я упоминал выше, - это использование охватывающего индекса , чтобы все необходимые столбцы были включены в структуру данных индекса. Преимущество состоит в том, что все ваши поиски - O (log n), и запросу не нужно делать второй ввод-вывод для чтения физической строки, чтобы получить другие столбцы.
В этом случае вы должны создать индекс покрытия по столбцам token, source, count
, как я упоминал выше. Также попытайтесь выделить достаточно места для кэширования, чтобы индекс мог кэшироваться в памяти.