php explain type等级,php - 如何提高查询性能(使用explain命令结果之类) - SO中文参考 - www.soinside.com...

您可以尝试这样的操作(尽管对我来说测试不可行)SELECT

sac.surveyId,

q.cat,

SUM((sac.answer_id*q.weight))/SUM(q.weight) AS score,

user.division_id,

user.unit_id,

user.department_id,

user.team_id,

division.division_name,

unit.unit_name,

dpt.department_name,

team.team_name

FROM survey_answers_cache sac

JOIN

(

SELECT

s.surveyId,

sc.subcluster_id

FROM

surveys s

JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id

JOIN cluster c ON sc.cluster_id = c.cluster_id

WHERE

c.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0

) AS v ON v.surveyid = sac.surveyid

JOIN user ON user.user_id = sac.user_id

JOIN questions q ON q.question_id = sac.question_id

JOIN division ON division.division_id = user.division_id

LEFT JOIN unit ON unit.unit_id = user.unit_id

LEFT JOIN department dpt ON dpt.department_id = user.department_id

LEFT JOIN team ON team.team_id = user.team_id

GROUP BY user.team_id, v.surveyId, q.cat

ORDER BY v.surveyId, user.team_id, q.cat ASC

所以我希望我不会弄乱任何东西。

无论如何,这个想法是在内部查询中,您仅根据where条件选择所需的行。这将创建一个较小的tmp表,因为它只提取两个都为int的字段。

然后在外部查询中,您连接到实际上从表,顺序和组中提取其余数据的表。这样,您可以对较小的数据集进行排序和分组。而且您的where子句可以以最佳方式运行。

您甚至可以省略其中的一些表,因为它们只是从其中的一些表中提取数据,而又看不到完整的架构及其相关性,这很难说。

但是一般来说,这部分(子查询)SELECT

s.surveyId,

sc.subcluster_id

FROM

surveys s

JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id

JOIN cluster c ON sc.cluster_id = c.cluster_id

WHERE

c.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0

是您的WHERE子句直接影响的内容。看到了,我们可以优化这一部分,然后使用它来结合您需要的其余数据。

从上面可以很容易地得出删除表的例子,请考虑一下SELECT

s.surveyId,

sc.subcluster_id

FROM

surveys s

JOIN subcluster sc ON s.subcluster_id = sc.subcluster_id

WHERE

sc.cluster_id=? AND sc.subcluster_id=? AND s.active=0 AND s.prepare=0

c表cluster从不用于提取数据,仅用于哪里。所以不是JOIN cluster c ON sc.cluster_id = c.cluster_id

WHERE

c.cluster_id=?

等于或等同于WHERE

sc.cluster_id=?

因此,我们可以完全消除该连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值