【发布时间】:2014-02-28 18:40:06
【问题描述】:
这是需要 400 秒才能加载的查询。我直接在mysql中试过。如果我单独尝试子查询,所有子查询都会在不到 0.01 秒内执行。 在 40 秒内查询联合后的所有执行。联合之前的查询全部在 1 秒内执行。
sales 表和 salesaff 表均包含大约 12K 条记录。此查询的目的是当 vendor=affiliate 在 sales 表中时,我需要从 salesaff 表中添加 id 与 sales 表中的搜索条件匹配的行。
(
SELECT 'no' AS aff, ss.orderid,ss.saletype,ss.price,ss.salests
FROM sales ss
WHERE 1=1 AND
( ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade')
)
UNION ALL
(
SELECT 'yes' AS aff, sf.orderid,sf.saletype,sf.price,sf.salests
FROM salesaff sf
WHERE sf.vendor=sf.affiliate AND
sf.orderid IN (SELECT ss.orderid from sales ss WHERE 1=1
AND ( ss.vendor='3kpertrade' OR ss.affiliate='3kpertrade')
GROUP BY ss.orderid )
)
ORDER BY salests DESC
【问题讨论】:
-
Where 1=1 业务有什么用?没必要。另外,请格式化您的 SQL,以便我们阅读。
-
尝试不使用 order by 子句,看看效果如何。
-
1=1 是编写动态查询,以便我可以从脚本中添加 AND column=condition。我删除了 1=1 并尝试不改变性能。
-
第二个查询本身需要 40 秒,改进了无顺序 4 秒。
-
尝试使用 EXPLAIN 查看瓶颈在哪里。 slideshare.net/phpcodemonkey/mysql-explain-explained