Я пытаюсь оптимизировать запрос, который по мере роста базы данных сильно снижает его производительность.
Справочная информация: мы пытаемся найти список пользователей, прошедших курс, и их учетные данные сейчас должен быть продлен (или не продлен). При поиске запроса мы должны заглянуть в таблицу регистрации (которая является той же таблицей, которая содержит всю их историю регистрации) и найти записи, в которых они не обновлялись. (Каждый раз, когда клиент проходит курс, к нему добавляется регистрационная запись.) Запрос, который я хочу оптимизировать, выглядит, чтобы увидеть, прошли ли они (клиент) тот же тип курса в дату / время после последнего занятия (из однотипные) взяли. Если нет записи, это должно привести к строке (строкам), что они не возобновили свой курс. это звучит легко, но, как вы знаете, когда вы в самом разгаре написания запроса, он становится очень сложным - и тем более, когда база данных становится настолько большой, что поиск занимает почти 5-6 минут данные. Итак, я прошу помощи о том, как я могу оптимизировать усилия моего предшественника, ниже.
Вот запрос на данный момент (не смейтесь, он был начат не мной - я взял на себя проект).
Не знаю, с чего начать оптимизацию этого MySQL. Я думаю, что в JOINS должны быть операторы select, но я в вашей власти, чтобы указать мне, с чего начать! (Я не любитель db, но предложил взглянуть и посмотреть, где мы можем это исправить).
Большое спасибо за чтение.
Lee
SELECT
r.GUID AS `A/C #`,
concat( a.AttendeeLastName, ', ', a.AttendeeFirstName ) AS Full Name (Last, First),
r.CourseExpirationDateFull AS `Exp Date`,
mtype_master_abbrev AS Course,
a.EmailName AS Email,
r.EventID,
r.EventTypeMasterID,
m.type_master_name,
IF( ( r.CourseExpirationDateFull < curdate( ) ), 'Expired', 'Valid' ) AS Status,
e.StartDateTime,
( to_days( curdate( ) ) - to_days( r.ExpNoticeSent ) ) AS Last Notice,
r.AttendeeID,
a.AttendeeCredentials,
r.RegistrationID,
r.RenewedExternalYYYY,
r.ExpNoticeSent,
q.RenewedRegID,
rs.reg_status_name AS `Reg Status`,
( to_days( r.CourseExpirationDateFull ) - to_days( curdate( ) ) ) AS Days2Exp,
a.flgReturnEmail,
a.flgSendEmail,
r.reg_type_ID,
a._usr_flg_do_not_call,
a.flgPrintLetter
e.EventTypeMasterID AS MasterID,
c.Last: yy-mm-dd - by - topic AS LastComm,
r.reg_renewal_status_id
FROM
vjgzuqrr_wtsql.registration r LEFT JOIN vjgzuqrr_wtsql.events ON ( r.EventID = events.EventID ) LEFT JOIN
vjgzuqrr_wtsql.attendees a ON a.ID = r.GUID LEFT JOIN
vjgzuqrr_wtsql.tbl_crs_type_master m ON r.EventTypeMasterID = m.ID_crs_type_master LEFT JOIN
vjgzuqrr_wtsql.qryrenreg q ON r.RegistrationID = q.OrigRegID LEFT JOIN
vjgzuqrr_wtsql.tbl_reg_status rs ON rs.ID_reg_status = r.RegistrationStatus LEFT JOIN
vjgzuqrr_wtsql.v_last_contact c ON c.registrationid = r.RegistrationID
WHERE
r.Role = 1
AND r.reg_type_ID IN ( 1, 2 )
AND r.CompletionStatus IN ( 9, 8 )
AND r.r IN ( 1, 14, 9 )
AND ( r.EventTypeMasterID IS NOT NULL OR r.EventTypeMasterID = 17 )
AND r.flgDelete = 0
AND r.flgTest = 0
AND e.flgDelete = 0
AND e.flgTestCourse = 0
AND e.flgDelete = 0
AND a.flgTest = 0
AND isnull( q.RenewedRegID )
AND a.flgReturnEmail = 0
AND m.type_master_abbrev NOT IN ( 'EKGPHARM', 'IVCERT', 'sem', 'fam&friends', 'cccc' )
Изменить, чтобы включить Объяснение:
форматированное объяснение