1

这个查询需要一个小时

select *,
      unix_timestamp(finishtime)-unix_timestamp(submittime) timetaken 
from joblog 
where jobname like '%cas%' 
and submittime>='2013-01-01 00:00:00' 
and submittime<='2013-01-10 00:00:00'
order by id desc limit 300;

但同一个查询submittime在 0.03 秒内完成

该表有 210 万行

任何想法是什么导致了问题或如何调试它

4

3 回答 3

0

您可以尝试在查询中添加一个 LIMIT ,看看这是否会提高它返回的速度......

摘自http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

“有时 MySQL 不使用索引,即使索引可用。这种情况发生的一种情况是优化器估计使用索引将需要 MySQL 访问表中很大比例的行。(在这种情况下,表扫描可能会快得多,因为它需要更少的查找。)但是,如果这样的查询使用 LIMIT 只检索一些行,MySQL 无论如何都会使用索引,因为它可以更快地找到少数几行返回结果。”

于 2013-01-17T17:20:39.057 回答
0
select *,unix_timestamp(finishtime)-unix_timestamp(submittime) timetaken  
from joblog  
where   (submittime between '2013-01-10 00:00:00'  and  '2013-01-19 00:00:00')   
and jobname is not null 
and jobname like '%cas%';

这有帮助

(0.93 秒)

于 2013-01-18T07:04:08.777 回答
0

您的第一步应该是使用MySQL EXPLAIN查看查询在做什么。它可能会让您对如何解决您的问题有所了解。

我的猜测是这jobname LIKE '%cas%'是最慢的部分,因为您正在进行通配符文本搜索。在此处添加索引甚至无济于事,因为您有一个前导通配符。有没有办法在没有这样的前导通配符的情况下执行此查询?另外添加索引submittime可能会提高此查询的速度。

于 2013-01-17T17:15:02.053 回答