#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 в соответствии с размером вашей базы данных и конфигурацией сервера)