提高mysql查询性能

时间:2013-11-29 21:33:42

标签: 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");

有更好,更高效的方法吗?

感谢。

3 个答案:

答案 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)