【发布时间】:2015-03-05 05:40:18
【问题描述】:
我有一个结构如下的表
SHOW CREATE TABLE data_temperature;
CREATE TABLE `data_temperature` (
`temperature_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`data_id` bigint(20) unsigned NOT NULL,
`x_id` varchar(32) DEFAULT NULL,
`x_sn` varchar(16) DEFAULT NULL,
`x_unit` char(1) DEFAULT NULL,
`x_value` decimal(6,2) DEFAULT NULL,
PRIMARY KEY (`temperature_id`),
KEY `created` (`created`),
KEY `data_id` (`data_id`),
KEY `x_value` (`x_value`)
) ENGINE=InnoDB AUTO_INCREMENT=6274618 DEFAULT CHARSET=latin1
我有一个从这里提取数据的基本查询,这真的很慢。所以我将查询分解为更简单的术语,发现这个非常简单的查询很慢(17.52 秒):
SELECT data_temperature.x_value FROM data_temperature WHERE data_temperature.created BETWEEN '2015-02-02 18:28:42' AND '2015-03-04 18:28:42';
该表有 6,274,617 行。事实上,SELECT COUNT(*) FROM data_temperature 也需要 3.66 秒。
运行此查询的系统是我的开发系统,它是运行 Ubuntu 14.04 的四核、4GB RAM 和固态驱动器。
这是关于运行这样的查询需要多长时间,还是我做错了什么?有没有更高效的数据返回方式?
【问题讨论】:
-
日期时间字段是否被索引?这将极大地帮助您根据该条件进行搜索
-
@Hanky웃Panky 我以为直到你问。我认为我的问题中的
CREATE TABLE表明它是,但如果你问,也许我读错了。 -
在查询之前运行 EXPLAIN 以查看您的索引是否被拾取?
-
不是,虽然我怀疑这是因为我返回了 1848520 行,或者 1848520/6274617 =~ 29% 的表,所以优化器跳过了索引。如果我缩短范围以返回更少的行(例如,一周的价值而不是一个月的价值),那么
EXPLAIN表明它确实使用了索引,但它的运行速度仍然比我预期的要慢得多(1.47 秒)像这样简单的SELECT。
标签: mysql mariadb mysql-slow-query-log