【发布时间】:2016-02-25 05:05:09
【问题描述】:
如何优化这条mysql语句?
SELECT DISTINCT p.name
FROM Something_Meta s1
JOIN Something_Meta s2 ON s1.fk_somethingId = s2.fk_somethingId
JOIN Products p ON s2.fk_productId = p.id
JOIN
(
select fk_id from Restricted where fk_foo != 233 and fk_id NOT IN
(
Select fk_id from Restricted where fk_foo = 233
)
)
r ON r.fk_id = p.id
WHERE s1.fk_somethingId = 63 AND s2.fk_somethingId <> s1.fk_somethingId
order by p.name ASC
我的桌子是这样的
Product (id,name )
Restricted (id,fk_id,fk_foo )
Something_Meta (id,fk_id,fk_somethingId )
fk_id 是产品 (id) 的外键
可能sql语句需要优化..
select fk_id from Restricted where fk_foo != 233 and fk_id NOT IN
(
Select fk_id from Restricted where fk_foo = 233
)
整个查询语句需要超过 1.5 秒才能运行,对于一个网站来说,单个查询需要很多秒。
【问题讨论】:
-
一些上下文会有所帮助,例如有多少记录在 Restricted
-
NOT IN 在空值的情况下是危险的。提前警告
-
@Drew 是的,感谢您的观点,但根据定义,所有单元格都不是空的。 ;) 我希望解决 NOT IN 问题。对吗?
-
是的,是knowing your data的情况,很多人都没有
-
但我们不能真诚地在不知道您的架构的情况下就索引更改提出建议,以及我们将通过说尝试这个索引或那个索引来打击您系统的其他部分。晚上打字后睡觉很有趣
标签: mysql sql join optimization query-optimization