首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql查询在时间戳的日期范围内非常慢

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

Stack Overflow用户
提问于 2014-05-30 06:05:20
回答 2查看 18.5K关注 0票数 13

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

代码语言:javascript
复制
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 12 i7
EN

回答 2

Stack Overflow用户

发布于 2014-05-30 06:13:39

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

将列包装在函数中(如DATE(),如查询中所示),将禁用MySQL优化器使用范围扫描操作。对于您的查询,即使有可用的索引,MySQL也会在每次运行该查询时对表中的每一行进行全面扫描。

为了提高性能,在"bare“列上使用谓词,例如:

代码语言:javascript
复制
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需要一个适当的索引才能对这个特定的查询使用有效的范围扫描操作。适用于此查询的最简单索引是:

代码语言:javascript
复制
... ON stocktrack (date_run) 

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

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

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

你问的问题..。

“.对选项文件的任何修改.”

这个问题的答案实际上将取决于您正在使用的存储引擎(MyISAM或InnoDB)。最大的好处在于分配足够的缓冲区来存储内存中的数据库块,以减少I/O。但这是以其他运行的内存不足为代价的,过度分配内存是没有好处的。除了查询性能之外,有关MySQL服务器调优的问题可能会在dba.stackexchange.com上被问得更好。

票数 20
EN

Stack Overflow用户

发布于 2014-05-30 06:42:41

首先,您必须为date_run列创建索引,然后像这样进行比较(如果您的格式是‘compare :i:s’)

代码语言:javascript
复制
select 
    *
from 
    stocktrack
where 
    date_run >= '2014-05-22 00:00:00'
    and date_run <= '2014-05-29 00:00:00'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23948113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档