mysql表中有一个表有大约176万条记录并且还在增长。似乎记录越多,记录就越慢。下面运行一个简单的查询大约需要65秒。 Date_run是一个时间戳字段。我想知道是否会让它运行得慢一些。我可以在选项文件中调整任何建议,以使这个宝贝更快?
select *
from stocktrack
where date(date_run) >= '2014-5-22'
and date(date_run) <= '2014-5-29'
答案 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'