我有一个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中选择不同的日期,其中日期> =“2013-01-01” 按日期排序asc limit 100;
但是我可以select count(*) from minute_data;
并且很快完成。
我知道它必须与表格中有超过3.74亿行数据这一事实有关,而我的台式电脑与超级计算机相差甚远。
有没有人知道我可以尝试加快查询的速度?我是否需要放弃使用MySQL表的所有希望?
非常感谢!
答案 0 :(得分:2)
如果您的(symbol, date)
主键上有2列的复合索引,则按键前缀搜索和分组将会很快。但是搜索不包含索引中第一列的内容需要扫描所有行或使用其他索引。
如果您通常不需要(date, symbol)
搜索symbol
,则可以将主键更改为date
。或者您可以在date
上添加其他索引:
alter table minute_data add index (date)