我正在运行以下表单的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");
有更好,更高效的方法吗?
感谢。
答案 0 :(得分:2)
JOINS(根据我的经验)比IN查询更有效。还要检查您的索引设置是否正确。
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'
答案 1 :(得分:0)
EXISTS比IN
更快我认为Peter的查询比IN更快。但你试试这个吗?以下查询也会与您和彼等产生相同的结果。
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)
日期(DateVal)无法使用INDEX
顺便说一下,即使“DateVal”是索引列,也不能使用索引。如果是DATETIME列
DateVal BETWEEN '2013-06-18 00:00:00' AND '2013-06-18 23:59:59'
以上可以使用索引。
此外,我认为应该存在INDEX(DateVal,column_name)以使其进行索引扫描。
答案 2 :(得分:0)
也许还考虑索引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)