【发布时间】:2012-08-23 18:45:54
【问题描述】:
我查询了 sql,但它真的很重,我真的不知道如何优化它,解释在后面:
SELECT tyds.user_tyd,
tyds.product_tyd,
tyds.action_tyd,
products.price_product,
data_8,
data_9,
avg_8,
sum_9
FROM tyds
INNER JOIN products
ON tyds.product_tyd = products.id_product
INNER JOIN (SELECT product_tyd,
Avg(data_tyd) AS avg_8
FROM tyds
WHERE action_tyd = 8
GROUP BY product_tyd) Agg_1
ON Agg_1.product_tyd = tyds.product_tyd
INNER JOIN (SELECT product_tyd,
Sum(data_tyd) AS sum_9
FROM tyds
WHERE action_tyd = 9
GROUP BY product_tyd) Agg_2
ON Agg_2.product_tyd = tyds.product_tyd
INNER JOIN (SELECT product_tyd,
data_tyd AS data_8
FROM tyds
WHERE user_tyd = 3
AND action_tyd = 8) Agg_3
ON Agg_3.product_tyd = tyds.product_tyd
INNER JOIN (SELECT product_tyd,
data_tyd AS data_9
FROM tyds
WHERE user_tyd = 3
AND action_tyd = 9) Agg_4
ON Agg_4.product_tyd = tyds.product_tyd
WHERE tyds.user_tyd = 3
AND tyds.action_tyd = 1
GROUP BY tyds.product_tyd
所有这些都是因为我需要得到很多东西: 我在 tyds.user_tyd = 3 中定义了一个 id_user tyds.action_tyd = 1 因为我想按 tyds.product_tyd 分组 WHERE 以前的 id_user 作为 tyds.action_tyd = 1。
然后我想要: -data_8 是 tyds.data_tyd 的值,其中 user_tyd = 3 AND action_tyd = 8 -data_9 也一样
-对于 AVG 和 COUNT,我想跳过 tyds.user_tyd 条件,只按 id_product 分组。
实际上,这个查询是有效的,但我认为它真的很重并且有太多的 SELECT...
一个月前我提出了一个类似的问题,但我不得不审查我的架构,所以很抱歉......
非常感谢。
e1 : 我使用 MySQL
【问题讨论】:
-
是否需要在一个查询中保存?
-
嗯,它会执行很多时间,所以我认为它更好。而且我将有一些页面包含 3 种此类...实际上看起来并不太慢,但我更喜欢考虑 optimiz。现在。
-
好的,我明白你的意思。我的建议是为内部连接中的每个子查询准备一个临时表。我相信它会更快。如果您不想这样做,请告诉我们您使用哪些 dbms。你有关于表的索引吗?
-
这似乎很有趣,即使我不知道你是怎么做到的。我在每个 id_TABLE 上都有索引。
-
+1 给格式化该 sql 的人。
标签: mysql sql query-optimization average