提高mysql查询性能

提高mysql查询性能,mysql,Mysql,我正在运行以下形式的mysql查询,这需要相当长的时间才能完成: select distinct(column_name) from table where date(DateVal)="2013-06-18" and column_name IN (select distinct(column_name) from table where date(DateVal)="2013-06-17"); 有没有更

我正在运行以下形式的mysql查询,这需要相当长的时间才能完成:

select distinct(column_name) 
from table where date(DateVal)="2013-06-18" 
and column_name IN (select distinct(column_name) 
                    from table 
                    where date(DateVal)="2013-06-17");
有没有更好、更高效的方法

谢谢。

根据我的经验,联接比查询更有效。还要检查索引设置是否正确

SELECT DISTINCT a.column_name
FROM MyTable a 
JOIN MyTable b ON a.column_name = b.column_name
WHERE DATE(a.DateVal) = '2013-06-18' AND DATE(b.DateVal) = '2013-06-17'

存在速度比中快

我认为彼得的质询比他的质询快。但是你试过这个吗?下面的查询也会生成与您的和peters相同的结果

select column_name
from table x
where date(DateVal)="2013-06-18" 
  and EXISTS  (select 1 from table where date(DateVal)="2013-06-17" AND column_name = x.column_name)
date(DateVal)不能使用索引

顺便说一句,即使“DateVal”是索引列,也不能使用索引。如果是DATETIME列

DateVal BETWEEN '2013-06-18 00:00:00' AND '2013-06-18 23:59:59'
上面可以使用索引


我也认为应该有索引(DeaValm,CulnNo.Nosile)来做索引扫描。

< P>也可以考虑索引DateVal列

这个怎么样

declare @RecentDateVal datetime
declare @PreviousDateVal datetime
declare @Cnt int

Set @RecentDateVal = "2013-06-18"
Set @PreviousDateVal = "2013-06-17" 

select @Cnt = count(column_name) from table where DateVal=@PreviousDateVal
select if(@Cnt > 0,select distinct(column_name) from table where DateVal=@RecentDateVal,null)

但是联接查询不一定会返回与查询中的
相同的内容。@horse对我来说是一个新名称。你能举个例子吗?总是愿意学习;)请参见此处:(顺便说一句:
distinct
不是一个函数。它总是对选择列表中的所有列进行操作。列周围的括号不会改变这一点)在这种情况下,使用JOIN的查询将给出相同的结果。如果在“2013-06-18”和“2013-06-18 23:59:59”之间将
DATE(a.DateVal)=“2013-06-18”转换为
a.DateVal,也会有很大帮助(或者使用
=
@a_horse_和_no_name,这当然是有道理的。但distinct已经解决了这种情况下的问题。无论如何,感谢您提供的示例。