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

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

select *
from stocktrack
where date(date_run) >= '2014-5-22'
and date(date_run) <= '2014-5-29'

> MysqL 5.6版
> Windows 8.1 64位
>英特尔酷睿i7-4770,3.40Ghz 12GB RAM

最佳答案
要提高此查询性能,请使用合适的索引(将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上提出.

相关文章

优化MySQL数据库发布系统存储的方法有:1.mysql库主从读写分...
使用mysql的方法:在“我的电脑”→右键→“管理”→“服务”...
在mysql中查看root用户权限的方法:1.命令行启动mysql服务;...
MySQL主从复制是用来备份一个与主数据库一样环境的从数据库,...
运行mysql的方法1.启动mysql服务,在“我的电脑”→右键→“...
开启mysql的方法1.可以通过快捷键win+r,输入cmd,打开窗口,...