сложный запрос - посмотрите назад на данные той же таблицы, чтобы вывести результаты в формате mysql (ОЧЕНЬ медленный запрос) - PullRequest
2 голосов
/ 07 августа 2020

Я пытаюсь оптимизировать запрос, который по мере роста базы данных сильно снижает его производительность.

Справочная информация: мы пытаемся найти список пользователей, прошедших курс, и их учетные данные сейчас должен быть продлен (или не продлен). При поиске запроса мы должны заглянуть в таблицу регистрации (которая является той же таблицей, которая содержит всю их историю регистрации) и найти записи, в которых они не обновлялись. (Каждый раз, когда клиент проходит курс, к нему добавляется регистрационная запись.) Запрос, который я хочу оптимизировать, выглядит, чтобы увидеть, прошли ли они (клиент) тот же тип курса в дату / время после последнего занятия (из однотипные) взяли. Если нет записи, это должно привести к строке (строкам), что они не возобновили свой курс. это звучит легко, но, как вы знаете, когда вы в самом разгаре написания запроса, он становится очень сложным - и тем более, когда база данных становится настолько большой, что поиск занимает почти 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' )

Изменить, чтобы включить Объяснение:

форматированное объяснение

1 Ответ

1 голос
/ 09 августа 2020

Извините, я немного медленный, mysql, Это ничего не ускоряет (я думаю, но это может немного помочь), но это должно помочь в чтении не ломающим голову способом. (надеюсь, это также поможет другим взглянуть на это.)

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 e ON r.EventID = e.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' ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...