2014-08-31 68 views
1

我有这样的SQL查询:如何使一个SQL查询过程更快使用NOT IN

SELECT sequence, ticketnumber FROM tickets t 
WHERE t.ticketnumber NOT IN (SELECT ticketnumber FROM ticket_updates) 

它查询数千行的两个表中 - 我怎样才能使它运行更快一点?有其他选择吗?

+1

这些可以给你更好的主意,选择哪种方法[* LEFT JOIN/IS NULL与NOT IN与NOT EXISTS:空列*](HTTP://星球.mysql.com/entry /?id = 24888),[* NOT IN vs. NOT EXISTS vs. LEFT JOIN/IS NULL:MySQL *](http://explainextended.com/2009/09/18/not-in -vs-not-exists-vs-left-join-is-null-mysql /) – 2014-08-31 18:37:04

+1

你可以尝试一个LEFT OUTER JOIN而不是子选择,但我不确定它会更快。 – Philipp 2014-08-31 18:37:14

回答

2

试试这个:

SELECT sequence, ticketnumber FROM tickets t 
WHERE NOT EXISTS (SELECT u.ticketnumber FROM ticket_updates u WHERE u.ticketnumber = t.ticketnumber) 

NOT EXISTS查询是针对这种情况优化(只看到如果行/不存在)。这不是唯一的选择,其他查询将评估为相同的操作,但这是我会选择,因为它明确要求什么。

此外,对于这类查询(在NOT EXISTS),索引ticket_updates.ticketnumber也会产生性能提高,因为查找速度可能会从O(n)到这里O(log(n))O(1)(完整的猜测......请纠正我,如果我完全错误)。

+0

效果更好!谢谢.. – Charlie 2014-08-31 19:01:10

3

MySQL并没有很好地优化这种类型的子查询。它将继续为外部查询中的每一行运行第二个SELECT。使用LEFT JOIN代替:

SELECT sequence, ticketnumber FROM tickets t LEFT JOIN ticket_updates tu ON (tu.ticketnumber = t.ticketnumber) WHERE tu.ticketnumber IS NULL;