Mysql 为什么将这个额外的条件添加到我的查询中会使执行时间大大延长

Mysql 为什么将这个额外的条件添加到我的查询中会使执行时间大大延长,mysql,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.us

这就是我所说的问题:

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
查询几乎立即运行,但在添加第二部分后,它会锁定数据库。就我的一生而言,我无法理解为什么它会对持续时间产生如此大的影响,因为这只是许多其他项目中的另两个比较

查询所做的是从nxd中选择stuff,其中N中的这两个(CodPCC,TipPCC)与D中的CodPCC和TipPCC重合,或者N中的(CodPCCOA,Relatie)与D中的相同两行重合


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

最大的区别是,您正在将一个简单的内部联接更改为一个必须在表之间的交叉联接上求值的表达式

首先,您不应该以这种方式编写join,而应该使用
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 ...

如果
内部联接在这两组条件下是有效的,您也可以尝试一下,但数据库可能无法将其优化为一个好的查询。

工作得很好。我想我有很多关于优化器工作原理的知识要学习。我尝试了左连接和内连接,在数据量更大的情况下,左连接获胜(N中有400000行,D中有130000行)。
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 ...