MySQL查询优化-共享查询需要优化

时间:2019-12-09 11:14:49

标签: mysql

请帮助我在下面的查询中进行优化-

SELECT DISTINCT
    al.displayName AS 'Brand',
    al.locationName AS 'Campus',
    pg.groupName AS 'School Phase',
    result.programName AS 'Grade',
    pc.categoryName AS 'Grade Category',
    result.batchName AS 'Intake',
    result.periodName AS 'Period',
    admission.id AS 'ADmission',
    result.stdName AS 'Student Name',
    usr.code AS 'Student Id',
    result.courseName AS 'Subject',
    result.courseVariant AS 'Subject Variant',
    cc.categoryName AS 'Subject Category',
    fac.printName AS 'Teacher',
    result.planPrintName AS 'Scheme',
    planRank.marksObtainedFrom AS 'Maximum Marks',
    planRank.gradeObtainedFrom AS 'Maximum Grade',
    planRank.obtainedMarks AS 'Subject Level Marks',
    planRank.grade AS 'Subject Grade',
    planRank.obtainedMarks AS 'Percentage',
    planRank.status AS 'Result Status',
    result.levelOnePrintName AS 'Type',
    typeRank.effectiveMarks AS 'Type Marks',
    typeRank.grade AS 'Type Grade',
    typeRank.status AS 'Type Result Status',
    result.levelTwoPrintName AS 'Sub Type',
    subTypeRank.effectiveMarks AS 'Sub Type Marks',
    subTypeRank.grade AS 'Sub Type Grade',
    subTypeRank.status AS 'Sub Type Result Status',
    result.levelThreePrintName AS 'Method',
    result.effectiveMarks AS 'Method Marks',
    result.grade AS 'Method Grade',
    result.status AS 'Method Result Status',
    CASE
        WHEN evntDetail.eventName IS NULL THEN evnt.detailSequenceNumber
        WHEN evntDetail.eventName IS NOT NULL THEN evntDetail.eventName
        ELSE NULL
    END AS 'Event',
    eventMarks.effectiveMarks AS 'Event Marks',
    eventMarks.finalGrade AS 'Event Grade'
FROM
    marksheet AS result
        INNER JOIN
    admission AS admission ON admission.id = result.admissionId
        INNER JOIN
    users AS usr ON usr.id = result.studentId
        INNER JOIN
    academy_location AS al ON al.id = admission.academyLocationId
        INNER JOIN
    programs AS prgm ON prgm.id = result.programId
        LEFT OUTER JOIN
    program_group AS pg ON pg.id = prgm.programGroupId
        LEFT OUTER JOIN
    program_category AS pc ON pc.id = prgm.programCategoryId
        LEFT OUTER JOIN
    courses AS course ON course.id = result.courseId
        LEFT OUTER JOIN
    course_category AS cc ON cc.id = course.courseCategoryId
        LEFT OUTER JOIN
    program_batch_course_param AS param ON result.courseVariantId = param.courseVarientId
        AND result.periodId = param.progBatchPeriodConfigId
        LEFT OUTER JOIN
    prog_batch_course_faculty AS pbcf ON pbcf.progBatchCourseParamId = param.id
        LEFT OUTER JOIN
    users AS fac ON fac.id = pbcf.facultyId
        LEFT OUTER JOIN
    evaluation_plan_rank AS planRank ON result.admissionId = planRank.admissionId
        AND (result.courseVariantId = planRank.courseVariantId
        OR planRank.courseVariantId IS NULL)
        AND result.sectionId = planRank.sectionId
        AND result.periodId = planRank.periodId
        AND result.evaluationPlanId = planRank.evaluationPlanId
        LEFT OUTER JOIN
    evaluation_plan_level_one_rank AS typeRank ON result.admissionId = typeRank.admissionId
        AND (result.courseVariantId = typeRank.courseVariantId
        OR typeRank.courseVariantId IS NULL)
        AND result.periodId = typeRank.periodId
        AND result.sectionId = typeRank.sectionId
        AND result.evaluationPlanLevelOneId = typeRank.evaluationPlanLevelOneId
        LEFT OUTER JOIN
    evaluation_plan_level_two_rank AS subTypeRank ON result.admissionId = subTypeRank.admissionId
        AND (result.courseVariantId = subTypeRank.courseVariantId)
        AND result.periodId = subTypeRank.periodId
        AND result.sectionId = subTypeRank.sectionId
        AND result.evaluationPlanLevelTwoId = subTypeRank.evaluationPlanLevelTwoId
        INNER JOIN
    eval_seq_detail AS evnt ON result.evaluationPlanThreeId = evnt.evalSequenceId
        LEFT OUTER JOIN
    examination_result AS eventMarks ON result.admissionId = eventMarks.admissionId
        AND (result.courseVariantId = eventMarks.courseVariantId
        OR eventMarks.courseVariantId IS NULL)
        AND result.sectionId = eventMarks.sectionId
        AND result.periodId = eventMarks.periodId
        AND evnt.id = eventMarks.evaluationDetailSequenceId
        LEFT OUTER JOIN
    evaluation_type_course typeCourse ON eventMarks.courseVariantId = typeCourse.courseVariantId
        AND eventMarks.periodId = typeCourse.periodId
        LEFT OUTER JOIN
    exam_event_detail evntDetail ON eventMarks.evaluationDetailSequenceId = evntDetail.eventId
        AND evntDetail.evaluationTypeCourseId = typeCourse.id
WHERE
    eventMarks.examResultStatus IS NOT NULL
        AND result.evaluationPlanId IS NOT NULL
        AND result.evaluationPlanLevelOneId IS NOT NULL
        AND result.evaluationPlanLevelTwoId IS NOT NULL
        AND result.evaluationPlanThreeId IS NOT NULL;

在表中,marksheet =“ 740119”,而inspection_result =“ 4891575”是大约记录。 当我执行查询时,它将花费大约10分钟,并且还会显示超时错误,因为数据集很大。

我将索引应用于表的性能,但是查询仍然花费很多时间。

我在查询中应用了Explain来检查状态-

enter image description here

1 个答案:

答案 0 :(得分:0)

向您的查询添加关键字“ STRAIGHT_JOIN”。看起来您一切都在逻辑上正确对齐。您正在从主表查询并联接到所有辅助查询表。 MySQL有时会尝试根据表的行大小进行优化,并且会将较小的表视为更有益的路径,并且可能会阻塞。

SELECT STRAIGHT_JOIN (rest of query)

告诉MySQL按照您提供的顺序进行查询,不要以为我。

现在,也就是说,您实际上没有WHERE子句,该子句可能会利用索引。为了避免需要转到记录的每个数据页,如果您在where子句上有索引,则引擎可以通过索引对那些不为null的记录进行预限定。假设每个评估计划都是一个基于整数(数字)的“ ID”值,我将在其上添加一个索引

( evaluationPlanId, evaluationPlanLevelOneId, evaluationPlanLevelTwoId, evaluationPlanThreeId )