如何优化查询?我能读懂什么? (如果可以的话,用俄语,或英语)
How to optimize the query? What i could to read, for understand it? (in russian if you can, or english)
现在我的 MYSQL 查询如下。
但是在 700 个项目中,50 个参数和 12000 个项目参数。已创建外键,但要创建哪些索引 - 我不知道 :( 查询需要 45 秒以上。它太大了,正如我在某些论坛上看到的那样,即使我想每 5 分钟在 CRON 中进行一次。
如何优化该查询?我想创建什么索引?以及如何理解这个过程?谢谢
SELECT
`tt1`.`id` `projects_id`,
`tt2`.`projectparams_id`,
`tt2`.`defaultvalue`,
`tt2`.`defaultvaluealias`,
`tt2`.`globalvalue`,
`tt2`.`globalvaluealias`,
`tt2`.`value`,
`tt2`.`valuealias`
FROM
`projects` `tt1`
LEFT JOIN
(
SELECT
`t1`.`id` `projectparams_id`,
`t1`.`defaultvalue`,
`t1`.`defaultvaluealias`,
`t1`.`globalvalue`,
`t1`.`globalvaluealias`,
`t2`.`value`,
`t2`.`valuealias`,
`t2`.`projects_id`
FROM
`projectparams` `t1`
LEFT JOIN `projects_projectparams` `t2` ON `t2`.`projectparams_id` = `t1`.`id`
) tt2 ON `tt1`.`id` = `tt2`.`projects_id`
首先尝试在用于连接表的所有列上创建索引:
- 编号
- projects_id
- projectparams_id
这应该已经加快了速度。 (如果没有,您将必须更具体地说明您的用例和数据库字段。)
以及索引 - 您能否重新组织查询以删除内部子查询,例如:
SELECT
`tt1`.`id` `projects_id`,
`t1`.`id` `projectparams_id`,
`t1`.`defaultvalue`,
`t1`.`defaultvaluealias`,
`t1`.`globalvalue`,
`t1`.`globalvaluealias`,
`t2`.`value`,
`t2`.`valuealias`
FROM `projects` `tt1`
LEFT JOIN `projects_projectparams` `t2` ON `tt1`.`id` = `t2`.`projects_id`
LEFT JOIN `projectparams` `t1` ON `t2`.`projectparams_id` = `t1`.`id`
在您对 PaulF 的回答的评论中,它表明您不仅在寻找查询优化,而且确实在寻找另一个查询。您不需要所有产品有或没有特定参数,而是产品和参数的所有可能组合。
你应该提出这个新请求。
这里是获取所有项目/参数组合以及实际项目参数的查询:
select
p.id as projects_id,
pp.id projectparams_id,
pp.defaultvalue,
pp.defaultvaluealias,
pp.globalvalue,
pp.globalvaluealias,
ppp.value,
ppp.valuealias
from projects p
cross join projectparams pp
left join projects_projectparams ppp on ppp.projects_id = p.id
and ppp.projectparams_id = pp.id;
现在我的 MYSQL 查询如下。
但是在 700 个项目中,50 个参数和 12000 个项目参数。已创建外键,但要创建哪些索引 - 我不知道 :( 查询需要 45 秒以上。它太大了,正如我在某些论坛上看到的那样,即使我想每 5 分钟在 CRON 中进行一次。
如何优化该查询?我想创建什么索引?以及如何理解这个过程?谢谢
SELECT
`tt1`.`id` `projects_id`,
`tt2`.`projectparams_id`,
`tt2`.`defaultvalue`,
`tt2`.`defaultvaluealias`,
`tt2`.`globalvalue`,
`tt2`.`globalvaluealias`,
`tt2`.`value`,
`tt2`.`valuealias`
FROM
`projects` `tt1`
LEFT JOIN
(
SELECT
`t1`.`id` `projectparams_id`,
`t1`.`defaultvalue`,
`t1`.`defaultvaluealias`,
`t1`.`globalvalue`,
`t1`.`globalvaluealias`,
`t2`.`value`,
`t2`.`valuealias`,
`t2`.`projects_id`
FROM
`projectparams` `t1`
LEFT JOIN `projects_projectparams` `t2` ON `t2`.`projectparams_id` = `t1`.`id`
) tt2 ON `tt1`.`id` = `tt2`.`projects_id`
首先尝试在用于连接表的所有列上创建索引:
- 编号
- projects_id
- projectparams_id
这应该已经加快了速度。 (如果没有,您将必须更具体地说明您的用例和数据库字段。)
以及索引 - 您能否重新组织查询以删除内部子查询,例如:
SELECT
`tt1`.`id` `projects_id`,
`t1`.`id` `projectparams_id`,
`t1`.`defaultvalue`,
`t1`.`defaultvaluealias`,
`t1`.`globalvalue`,
`t1`.`globalvaluealias`,
`t2`.`value`,
`t2`.`valuealias`
FROM `projects` `tt1`
LEFT JOIN `projects_projectparams` `t2` ON `tt1`.`id` = `t2`.`projects_id`
LEFT JOIN `projectparams` `t1` ON `t2`.`projectparams_id` = `t1`.`id`
在您对 PaulF 的回答的评论中,它表明您不仅在寻找查询优化,而且确实在寻找另一个查询。您不需要所有产品有或没有特定参数,而是产品和参数的所有可能组合。
你应该提出这个新请求。
这里是获取所有项目/参数组合以及实际项目参数的查询:
select
p.id as projects_id,
pp.id projectparams_id,
pp.defaultvalue,
pp.defaultvaluealias,
pp.globalvalue,
pp.globalvaluealias,
ppp.value,
ppp.valuealias
from projects p
cross join projectparams pp
left join projects_projectparams ppp on ppp.projects_id = p.id
and ppp.projectparams_id = pp.id;