具有重复值的MySQL Use索引

时间:2019-03-10 19:36:33

标签: mysql sql

我有一个具有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'

后脚本:

对于这种问题,如果交换不正确,我深表歉意。如果没有,请提出一个更好的位置。

3 个答案:

答案 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 的行的预期较高值之后再进行检查。