我真的很简单地查询获取MIN和MAX值,它看起来像:
SELECT MAX(value_avg)
, MIN(value_avg)
FROM value_data
WHERE value_id = 769
AND time_id BETWEEN 214000 AND 219760;
在这里,您是value_data表的架构:
CREATE TABLE `value_data` (
`value_id` int(11) NOT NULL,
`time_id` bigint(20) NOT NULL,
`value_min` float DEFAULT NULL,
`value_avg` float DEFAULT NULL,
`value_max` float DEFAULT NULL,
KEY `idx_vdata_vid` (`value_id`),
KEY `idx_vdata_tid` (`time_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
如您所见,查询和表格很简单,我没有看到任何错误,但是当我执行此查询时,获取数据大约需要9秒钟。我还对此查询进行了分析,99%的时间是“发送数据”。
表非常大,重约2 GB,但这是一个问题吗?我不认为这张桌子太大了,一定是别的......
答案 0 :(得分:1)
MySQL可以轻松处理该大小的数据库。但是,您应该能够提高此查询的性能,并且通常可以提高表的性能。通过将time_id
列更改为UNSIGNED INT NOT NULL
,您可以显着减小该列上的数据和索引的大小。此外,您提到的查询可能会受益于(value_id, time_id)
上的复合索引。使用该索引,它将能够为查询的两个部分使用索引,而不是现在使用索引。
另外,请使用查询的EXPLAIN
修改您的问题。它应该确认我对索引的期望,但它总是有用的信息。
编辑:
您没有为表定义PRIMARY
索引,这肯定无助于您的情况。如果(value_id, time_id)
的值是唯一的,您可能应该在表的PRIMARY
索引之上提到新的复合索引。