mysql表中有一个表,它有大约176万条记录,而且还在增长。似乎它拥有的记录越多,获得的速度就越慢。在下面运行一个简单的查询大约需要65秒钟。Date_run是一个时间戳字段。我想知道这是否会使跑步速度变慢。有任何建议,我可以调整在选项文件,以使这个宝宝更快?
select *
from stocktrack
where date(date_run) >= '2014-5-22'
and date(date_run) <= '2014-5-29'发布于 2014-05-30 06:13:39
要提高此查询的性能,可以使用一个合适的索引(以date_run作为索引中的前导列),并在等效谓词中引用“裸列”。
将列包装在函数中(如DATE(),如查询中所示),将禁用MySQL优化器使用范围扫描操作。对于您的查询,即使有可用的索引,MySQL也会在每次运行该查询时对表中的每一行进行全面扫描。
为了提高性能,在"bare“列上使用谓词,例如:
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上被问得更好。
发布于 2014-05-30 06:42:41
首先,您必须为date_run列创建索引,然后像这样进行比较(如果您的格式是‘compare :i:s’)
select
*
from
stocktrack
where
date_run >= '2014-05-22 00:00:00'
and date_run <= '2014-05-29 00:00:00'https://stackoverflow.com/questions/23948113
复制相似问题