Команда mysql left join работает медленно

Проблема с очень медленным запросом MySQL с использованием левых соединений.

SELECT ip,T1.ipaddr,host,referrer,agent,page,url,thedate,DV,PV,notes
FROM visits_temp AS T1
LEFT JOIN (
    SELECT ipaddr,COUNT(DISTINCT LEFT(thedate,10)) AS DV
    FROM visits GROUP BY ipaddr
) AS T2 ON T1.ipaddr = T2.ipaddr
LEFT JOIN (
    SELECT ipaddr,notes
    FROM topvisitилиs
) As T3 ON T3.ipaddr = T1.ipaddr
LEFT JOIN (
    SELECT ipaddr,COUNT(ip) AS PV
    FROM visits
    GROUP BY ipaddr
) AS T4 ON T4.ipaddr = T1.ipaddr
WHERE referrer = '' AND
    thedate BETWEEN '2013-01-07 00:00:00' AND '2013-01-09 23:59:59'
GROUP BY T1.ip
илиDER BY thedate desc

Цель здесь состоит в том, чтобы получить прямой трафик посетителей для веб-сайта, чем LEFT JOINS, чтобы найти общее количество дней посещения (DV) и общее количество просмотренных страниц (PV). Таблица посещений содержит около 2,9 м записей в настоящее время, а поле ipaddr и thedate ARE индексировано. Этот запрос займет около 90 секунд.

SELECT ipaddr,COUNT(DISTINCT LEFT(thedate,10)) AS DV FROM visits GROUP BY ipaddr

или

SELECT ipaddr,COUNT(ip) AS PV FROM visits GROUP BY ipaddr

Отдельные команды выбора в LEFT JOINS, когда они запускаются сами по себе, завершатся через 0,03 секунды. Возможно, LEFT JOIN - это не тот подходящий способ, чтобы пойти в этой ситуации, я был бы готов к альтернативам.

0
nl ja de
Пробовали ли вы EXPLAIN PLAN ? Что он показывает?
добавлено автор Brian Hooper, источник
У меня были большие таблицы, которые очень сильно работали при использовании между в диапазонах дат. так или иначе MySQL отказывается от индексов при использовании такой конструкции.
добавлено автор Marc B, источник
Неа. x между y и z совпадает с x> = y и x <= z в любом случае в отношении компилятора/парсера. никогда не мог найти обходного пути, и в итоге просто отбивал и разбивал стол.
добавлено автор Marc B, источник
@MarcB Использует ли Date> = LowerBownd и Date <= UpperBound исправить проблему?
добавлено автор Conrad Frix, источник
Вам нужно показать нам определения таблиц и индексов. Для диагностики медленных запросов требуются полные определения таблиц и индексов, а не просто описание или парафраз. Возможно, ваши таблицы плохо определены. Возможно, индексы создаются неправильно. Возможно, у вас нет указателя на тот столбец, который, как вы думали, вы делали. Не видя определения таблиц и индексов, мы не можем сказать.
добавлено автор Andy Lester, источник
Каковы типы данных полей ipaddr и thedate?
добавлено автор Tom, источник

2 ответы

Эти 4 подзапроса, вероятно, немного замедляют работу.

Это должно быть тождественно вашему запросу, только быстрее:

SELECT ip,T1.ipaddr,host,referrer,agent,page,url,thedate,DV,PV,notes
FROM visits_temp AS T1
LEFT JOIN (
    SELECT ipaddr, COUNT(DISTINCT LEFT(thedate,10)) AS DV, COUNT(ip) AS PV
    FROM visits
    GROUP BY ipaddr
) AS T2 ON T1.ipaddr = T2.ipaddr
LEFT JOIN topvisitors T3 ON T3.ipaddr = T1.ipaddr
WHERE referrer = '' AND
    thedate BETWEEN '2013-01-07 00:00:00' AND '2013-01-09 23:59:59'
GROUP BY T1.ip
ORDER BY thedate desc

Если каждая строка из T1 должна иметь соответствующую строку в T2 и T3 , вы можете заменить свой LEFT JOIN с помощью JOIN , это должно позволить оптимизатору делать больше, что также может ускорить работу (хотя есть исключения).

Я не могу себе представить, что это возвращает желаемые результаты, он будет группироваться в ipaddr , но затем возвращает только (1) из этих групп для каждого ip . MySQL не мешает этому. Если вы немного уточните свои требования (с точки зрения полей/таблиц, которые вы используете), это не должно быть слишком сложно исправить (хотя это, вероятно, технически относится к другому вопросу).

0
добавлено

Вы используете referrer и thedate в своем предложении where. Создание составного индекса для этих двух полей таблицы visit_temp может повысить производительность.

Убедитесь, что у вас есть индекс в поле ipaddr в таблице topvisitors.

0
добавлено
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw