在大(2 GB)表上执行简单SELECT操作的性能

时间:2013-01-10 17:42:32

标签: mysql

我真的很简单地查询获取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,但这是一个问题吗?我不认为这张桌子太大了,一定是别的......

1 个答案:

答案 0 :(得分:1)

MySQL可以轻松处理该大小的数据库。但是,您应该能够提高此查询的性能,并且通常可以提高表的性能。通过将time_id列更改为UNSIGNED INT NOT NULL,您可以显着减小该列上的数据和索引的大小。此外,您提到的查询可能会受益于(value_id, time_id)上的复合索引。使用该索引,它将能够为查询的两个部分使用索引,而不是现在使用索引。

另外,请使用查询的EXPLAIN修改您的问题。它应该确认我对索引的期望,但它总是有用的信息。

编辑:

您没有为表定义PRIMARY索引,这肯定无助于您的情况。如果(value_id, time_id)的值是唯一的,您可能应该在表的PRIMARY索引之上提到新的复合索引。