0

我有非常简单的查询来获取 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,但有问题吗?我觉得这张桌子不会太大,肯定是别的东西……

4

1 回答 1

1

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

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

编辑:

您没有PRIMARY为表定义索引,这绝对对您的情况没有帮助。如果 的值(value_id, time_id)是唯一的,您可能应该PRIMARY在表的索引上方创建我提到的新复合索引。

于 2013-01-10T17:52:32.387 回答