我有一个具有500M +行的MySQL表,我想加快搜索速度。数据的格式如下:
Timestamp | Open | High | Low | Close | Volume | Ticker
2016-12-12 14:31:00 | 23.35 | 23.35 | 23.35 | 23.35 | 100 | RNG
2016-12-12 14:32:00 | 23.35 | 23.35 | 23.35 | 23.35 | 0 | RNG
2016-12-12 14:33:00 | 23.35 | 23.35 | 23.35 | 23.35 | 0 | RNG
2016-12-12 14:34:00 | 23.4 | 23.4 | 23.4 | 23.4 | 250 | RNG
...
2018-11-09 20:54:00 | 42.785 | 42.785 | 42.78 | 42.785 | 1300.0 | EWW
2018-11-09 20:55:00 | 42.785 | 42.805 | 42.785 | 42.805 | 1500.0 | EWW
2018-11-09 20:56:00 | 42.805 | 42.805 | 42.755 | 42.755 | 2500.0 | EWW
2018-11-09 20:57:00 | 42.755 | 42.755 | 42.755 | 42.755 | 1600.0 | EWW
2018-11-09 20:58:00 | 42.725 | 42.725 | 42.715 | 42.725 | 7500.0 | EWW
每个股票的数据按时间顺序升序排列
我想根据代码进行搜索,例如
SELECT * FROM minutely WHERE ticker="AAPL"
但是考虑到表的大小,这相当慢。我考虑过使用索引,但是由于行情栏包含重复的值,所以这是不可能的。
当前,如果我尝试使用命令ALTER TABLE minutely ADD primary key (ticker);
,我将得到ERROR 1062 (23000): Duplicate entry 'RNG' for key 'PRIMARY'
后脚本:
对于这种问题,如果交换不正确,我深表歉意。如果没有,请提出一个更好的位置。
答案 0 :(得分:2)
代替主键(根据定义是唯一的) 您只需创建一个索引
create index my_idx on minutely ( ticker) ;
正常索引(非唯一)允许重复值
答案 1 :(得分:1)
您的数据似乎具有一个自然主键,包含两个部分。所以试试这个:
ALTER TABLE minutely ADD primary key (ticker, timestamp);
使用此键作为主键,应比构建单独的索引更快。
答案 2 :(得分:0)
第一个想法是在查询中使用LIMIT
SELECT * FROM minutely WHERE ticker="AAPL" LIMIT 256;
这提供了 SELECT 命令的结尾,而没有所有表检查。 256是可以获取的最大预期行数的示例。
如果您不知道LIMIT,请先进行检查,然后在具有相同 ticker 的行的预期较高值之后再进行检查。