rya*_*zec 2 mysql performance optimization
所以我有一张有很多外键的表,但是当我要记录时,我需要加入这些表上的所有内容,因为我通常需要这些字段才能使记录有意义。基本查询如下所示:
SELECT i.id, i.`key`, i.title, i.description,
CONCAT(ru.firstName, ' ', ru.lastName) as `name`,
CONCAT(au.firstName, ' ', au.lastName) as `name`,
p.title, pc.title, pva.title, pvo.title, pvf.title, i.durationEstimate,
i.storyPoints, i.dueDate, isl.title, i.rejectionCount,
CONCAT(uc.firstName, ' ', uc.lastName) as `name`,
i.createdTimestamp, i.updatedTimestamp, it.title, isss.title
FROM ProjectManagement2.Issues i
INNER JOIN Users ru ON ru.id = i.reporterUserUsername
INNER JOIN Users au ON au.id = i.assignedUserUsername
INNER JOIN Projects p ON p.id = i.projectTitle
INNER JOIN ProjectComponents pc ON pc.id = i.projectComponentTitle
INNER JOIN ProjectVersions pva ON pva.id = i.affectedProjectVersionTitle
INNER JOIN ProjectVersions pvo ON pvo.id = i.originalFixedProjectVersionTitle
INNER JOIN ProjectVersions pvf ON pvf.id = i.fixedProjectVersionTitle
INNER JOIN IssueSecurityLevels isl ON isl.id = i.issueSecurityLevelId
INNER JOIN IssueTypes it ON it.id = i.issueTypeId
INNER JOIN IssueStatuses isss ON isss.id = i.issueStatusId
INNER JOIN Users uc ON uc.id = i.creatorUserUsername
LIMIT 50000, 100;
Run Code Online (Sandbox Code Playgroud)
这个查询在我第一次运行后大约需要 880 毫秒才能运行(需要几秒钟)。此查询的 EXPLAIN 显示:
1 SIMPLE pvo index PRIMARY title 98 NULL 22 Using index
1 SIMPLE i ref reporterUserUsername,assignedUserUsername,projectTitle,projectComponentTitle,affectProjectVersionTitle,originalFixedProjectVersionTitle,fixedProjectVersionTitle,issueSecurityLevelId,creatorUserUsername,issueTypeId,issueStatusId
originalFixedProjectVersionTitle 5 ProjectManagement2.pvo.id 1136 Using where
1 SIMPLE isl ALL PRIMARY NULL NULL NULL 5 Using where; Using join buffer
1 SIMPLE isss eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.issueStatusId 1
1 SIMPLE pc eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.projectComponentTitle 1
1 SIMPLE pva eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.affectedProjectVersionTitle 1
1 SIMPLE p eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.projectTitle 1
1 SIMPLE pvf eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.fixedProjectVersionTitle 1
1 SIMPLE ru eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.reporterUserUsername 1
1 SIMPLE au eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.assignedUserUsername 1
1 SIMPLE uc eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.creatorUserUsername 1
1 SIMPLE it eq_ref PRIMARY PRIMARY 4 ProjectManagement2.i.issueTypeId
Run Code Online (Sandbox Code Playgroud)
最大的问题是当我向查询添加订单时,在第一次查询后需要几秒钟。
我可以做些什么来优化此查询(如果您需要更多信息,请告诉我)?
您的原始查询将所有内容连接在一起,然后在显示接下来的 100 行之前将 50000 行遍历到连接数据中。尝试这个
这是我建议的查询
SELECT i.id, i.`key`, i.title, i.description,
CONCAT(ru.firstName, ' ', ru.lastName) as `name`,
CONCAT(au.firstName, ' ', au.lastName) as `name`,
p.title, pc.title, pva.title, pvo.title, pvf.title, i.durationEstimate,
i.storyPoints, i.dueDate, isl.title, i.rejectionCount,
CONCAT(uc.firstName, ' ', uc.lastName) as `name`,
i.createdTimestamp, i.updatedTimestamp, it.title, isss.title
FROM
(
SELECT B.* FROM
(SELECT id FROM ProjectManagement2 LIMIT 50000, 100) A
INNER JOIN ProjectManagement2 B USING (id)
) i
INNER JOIN Users ru ON ru.id = i.reporterUserUsername
INNER JOIN Users au ON au.id = i.assignedUserUsername
INNER JOIN Projects p ON p.id = i.projectTitle
INNER JOIN ProjectComponents pc ON pc.id = i.projectComponentTitle
INNER JOIN ProjectVersions pva ON pva.id = i.affectedProjectVersionTitle
INNER JOIN ProjectVersions pvo ON pvo.id = i.originalFixedProjectVersionTitle
INNER JOIN ProjectVersions pvf ON pvf.id = i.fixedProjectVersionTitle
INNER JOIN IssueSecurityLevels isl ON isl.id = i.issueSecurityLevelId
INNER JOIN IssueTypes it ON it.id = i.issueTypeId
INNER JOIN IssueStatuses isss ON isss.id = i.issueStatusId
INNER JOIN Users uc ON uc.id = i.creatorUserUsername
;
Run Code Online (Sandbox Code Playgroud)
试一试 !!!