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