0

我有一个表定义如下的 MYSQL DB:

CREATE TABLE `minute_data` (
  `date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `open` decimal(10,2) DEFAULT NULL,
  `high` decimal(10,2) DEFAULT NULL,
  `low` decimal(10,2) DEFAULT NULL,
  `close` decimal(10,2) DEFAULT NULL,
  `volume` decimal(10,2) DEFAULT NULL,
  `adj_close` varchar(45) DEFAULT NULL,
  `symbol` varchar(10) NOT NULL DEFAULT '',
  PRIMARY KEY (`symbol`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

它存储来自股票市场的 1 分钟数据点。主键是符号和日期列的组合。这样,我在任何时候每个符号都只有 1 个数据点。

我想知道为什么以下查询需要这么长时间,以至于我什至不能等待它完成:

从 test.minute_data 中选择不同的日期,其中 date >= "2013-01-01" order by date asc limit 100;

但是我可以select count(*) from minute_data;并且很快就完成了。

我知道这一定与表中有超过 3.74 亿行数据有关,而我的台式电脑与超级计算机相去甚远。

有谁知道我可以尝试加快查询速度?我是否需要放弃使用这么大的 MySQL 表的所有希望?

非常感谢!

4

1 回答 1

2

当您在 2 列上有一个复合索引时,例如您的(symbol, date)主键,按它们的键的前缀进行搜索和分组会很快。但是搜索不包括索引中第一列的内容需要扫描所有行或使用其他索引。

(date, symbol)如果您通常不需要搜索symbolwithout ,则可以将主键更改为date。或者您可以在以下位置添加额外的索引date

alter table minute_data add index (date)
于 2013-07-29T17:06:09.697 回答