为什么在我的查询中添加这个额外条件会使执行需要相当长的时间

时间:2012-01-25 09:51:18

标签: mysql

这是我正在谈论的问题:

SELECT COUNT
FROM Note N, DatePCC D
WHERE D.codClient = '2' AND 

((D.CodPCC = N.CodPCC AND D.TipPCC = N.TipPCC) OR (D.CodPCC = N.CodPCCOA AND D.TipPCC = N.Relatie)) 

AND (N.user = 'Server' OR N.user = 'ADMIN' OR N.user = 'Simona' OR N.user = 
'Viorel' OR N.user = 'Dan' OR N.user = 'Razvan') AND (N.TipNota = 'Telefon' OR N.TipNota = 
'Messenger' OR N.TipNota = 'Telefon esuat' OR N.TipNota = 'Email' OR N.TipNota = 'Evaluare 
curs' OR N.TipNota = 'Corespondenta' OR N.TipNota = 'Vizita') AND 
(DATE(N.DataInregistrarii) >= '2000-01-01' AND DATE(N.DataInregistrarii) <= '2012-01-25') 
AND 1

这个问题来自我挑选过的那条线。当我简单地使用它时

(D.CodPCC = N.CodPCC AND D.TipPCC = N.TipPCC) 

查询几乎立即运行但在我添加第二部分之后它会锁定我们的数据库。在我的生活中,我不能弄清楚为什么它会如此影响持续时间,因为它只是另外两个比较中的另外两个。

查询的作用是从NXD中选择东西其中来自N的这两个(CodPCC,TipPCC)与来自D的CodPCC和TipPCC或来自N的(CodPCCOA,Relatie)重合,与来自D的相同两行重合。

知道这两个简单的比较是如何以如此巨大的方式改变查询的吗?或者我如何改变它才能正常工作?

1 个答案:

答案 0 :(得分:2)

最大的区别是因为您正在将一个简单的内连接更改为必须在表之间的交叉连接上进行求值的表达式。

您不应该首先以这种方式编写联接,而是使用join关键字:

select COUNT
from Note N
inner join DatePCC D on D.codClient = '2' and D.CodPCC = N.CodPCC and D.TipPCC = N.TipPC
where ...

要使新查询有效,您应该对同一个表进行两次左连接。这样,数据库可以为每个连接使用索引,而不是进行交叉连接。

select COUNT
from Note N
left join DatePCC D on D.codClient = '2' and D.CodPCC = N.CodPCC and D.TipPCC = N.TipPC
left join DatePCC D2 on D2.codClinent = '2' and D.CodPCC = N.CodPCCOA AND D.TipPCC = N.Relatie
where ...

您也可以尝试inner join对两组条件有效,但数据库可能无法将其优化为良好的查询。