Mysql查询在时间戳的日期范围内非常慢

时间:2014-05-30 06:05:20

标签: mysql sql

mysql表中有一个表有大约176万条记录并且还在增长。似乎记录越多,记录就越慢。下面运行一个简单的查询大约需要65秒。 Date_run是一个时间戳字段。我想知道是否会让它运行得慢一些。我可以在选项文件中调整任何建议,以使这个宝贝更快?

select *
from stocktrack
where date(date_run) >= '2014-5-22'
and date(date_run) <= '2014-5-29'
  1. mysql 5.6版
  2. Windows 8.1 64位
  3. Intel Core i7-4770,3.40Ghz 12gb RAM

2 个答案:

答案 0 :(得分:11)

要提高此查询的性能,请使用合适的索引(使用date_run作为索引中的前导列),并在等效谓词中引用“裸列”。

在函数中包装列(如DATE(),就像在查询中一样)禁止MySQL优化器使用范围扫描操作。通过查询,即使索引可用,每次运行该查询时,MySQL都会对表中的每一行进行完整扫描。

为了提高性能,请在“裸”列上使用谓词,例如:

WHERE date_run >= '2014-5-22' AND date_run <  '2014-5-29' + INTERVAL 1 DAY

(请注意,当我们省略日期文字的时间部分时,MySQL会假设时间组件为午夜'00:00:00'。我们知道每个日期时间/时间戳值,日期组件等于'2014-05 -29'保证不到'2014-05-30'的午夜。)

MySQL需要一个适当的索引才能对此特定查询使用有效的范围扫描操作。适用于此查询的最简单索引是:

... ON stocktrack (date_run) 

(请注意,任何以date_run作为前导列的索引都是合适的。)

使用索引的范围扫描操作(通常)在大型集合上更有效(和更快),因为MySQL可以非常快速地从考虑中消除大量行。如果没有范围扫描操作,MySQL必须检查表中的每一行。

使用EXPLAIN比较原始版本和修改版本之间的MySQL查询计划。


你问的问题......

“... 对选项文件的任何调整 ......”

该问题的答案实际上取决于您使用的是哪个存储引擎(MyISAM或InnoDB)。降压的最大好处来自于分配足够的缓冲区来保存内存中的数据库块,以减少I / O ......但这样做的代价是可以为运行的其他任何内存提供更少的内存,并且过度分配没有任何好处记忆。有关MySQL服务器调优的问题,除了查询性能之外,最好在dba.stackexchange.com上提出。

答案 1 :(得分:1)

首先,您必须为date_run列创建索引,然后进行比较(如果您的格式为&#39; Y-m-d H:i:s&#39;)

select 
    *
from 
    stocktrack
where 
    date_run >= '2014-05-22 00:00:00'
    and date_run <= '2014-05-29 00:00:00'