sql-запрос занимает слишком много времени в рабочей среде

#mysql

#mysql

Вопрос:

У меня есть запрос, который работает должным образом в локальной базе данных с небольшим набором данных, но в производстве это занимает слишком много времени, любая помощь по этому вопросу будет полезна:

 SELECT su.orgid, arc.userid, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 1 WEEK,arc.processed_records,0)) Record_Week, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 1 MONTH,arc.processed_records,0)) Record_Month, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 3 MONTH,arc.processed_records,0)) Record_3Month, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 6 MONTH,arc.processed_records,0)) Record_6Month, 
    SUM(IF(arc.create_dt>CURRENT_DATE - INTERVAL 1 YEAR,arc.processed_records,0)) Record_Year 
FROM archive.log_archive arc 
INNER JOIN prod_db.user su ON su.name = arc.userid
  

Комментарии:

1. Вы пропали GROUP BY su.orgid, arc.userid без вести . Для повышения производительности убедитесь, что объединяемые столбцы имеют индексы.

2. уже пробовал добавлять group by

3. Это нужно только для получения правильного результата. Не имеет значения, сколько времени это займет, если это неправильно.

4. На самом деле, к сожалению, MySQL удалил group by standard из своей вселенной. Это не будет работать хорошо, несмотря ни на что, поскольку create_date> приведет к увеличению индексов.

Ответ №1:

Может помочь выполнить суммы в подзапросе перед объединением, чтобы он мог работать с реальной таблицей, а не с временной таблицей после объединения.

 SELECT su.orgid, su.userid, a.record_week, a.record_month, a.record_3month, a.record_6month, a.record_year
FROM prod_db.user AS su
JOIN (SELECT userid,
        SUM(IF(create_dt>CURRENT_DATE - INTERVAL 1 WEEK,processed_records,0)) Record_Week, 
        SUM(IF(create_dt>CURRENT_DATE - INTERVAL 1 MONTH,processed_records,0)) Record_Month, 
        SUM(IF(create_dt>CURRENT_DATE - INTERVAL 3 MONTH,processed_records,0)) Record_3Month, 
        SUM(IF(create_dt>CURRENT_DATE - INTERVAL 6 MONTH,processed_records,0)) Record_6Month, 
        SUM(IF(create_dt>CURRENT_DATE - INTERVAL 1 YEAR,processed_records,0)) Record_Year 
    FROM archive.log_archive
    GROUP BY userid) AS arc 
ON su.name = arc.userid
  

К сожалению, я не думаю, что этот тип суммирования может использовать преимущества index on create_dt . Единственными полезными индексами являются userid и name .

Ответ №2:

такой запрос требует времени. Я предложу ниже шаг 1. оптимизируйте свой запрос (проверьте индексы в таблице) 2. вам следует настроить сервер mysql (изменить конфигурацию mysql в файле my.ini в соответствии с размером вашей базы данных и конфигурацией сервера)

https://mysqltuner.codeplex.com/

http://mysqltuner.com/