Вы не опубликовали свои индексы, но прежде всего вам нужно иметь индекс для (client_id, device_id)
для visited_links
и (client_id, device_id, id)
для device_tracker
, чтобы убедиться, что запрос полностью проиндексирован.
Со страницы 191 превосходного Высокопроизводительного MySQL, 2-е изд. :
MySQL имеет два вида стратегий GROUP BY, когда он не может использовать индекс: он может использовать временную таблицу или файловую сортировку для выполнения группировки. Любой из них может быть более эффективным в зависимости от запроса. Вы можете заставить оптимизатор выбрать один или другой метод с помощью подсказок оптимизатора SQL_BIG_RESULT и SQL_SMALL_RESULT.
В вашем случае, я думаю, что проблема связана с объединением нескольких столбцов и использованием GROUP BY
вместе, даже после того, как предложенные индексы введены в действие. Если вы удалите либо (a) одно из условий объединения, либо (b) GROUP BY
, для этого не требуется сортировка файлов.
Однако имейте в виду, что файловая сортировка не всегда использует реальные файлы, она также может происходить полностью в буфере памяти, если набор результатов достаточно мал, поэтому снижение производительности может быть минимальным. Также учтите время в часах для запроса.
НТН!