MySQL Использовать индекс с повторяющимися значениями - PullRequest
2 голосов
/ 10 марта 2019

У меня есть таблица MySQL с 500M + строками, и я хочу ускорить поиск.Данные форматируются следующим образом:

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'

Post Script:

Я прошу прощения, если это не правильный обмен для такого рода вопроса;если нет, пожалуйста, предложите лучшее место.

Ответы [ 3 ]

2 голосов
/ 10 марта 2019

Вместо первичного ключа (который является уникальным по определению) Вы должны просто создать индекс

create index my_idx on minutely  ( ticker) ; 

нормальный индекс (не уникальный), допустимое дублированное значение

1 голос
/ 11 марта 2019

Ваши данные будут иметь естественный первичный ключ с двумя компонентами.Попробуйте следующее:

ALTER TABLE minutely ADD primary key (ticker, timestamp);

Ваш запрос должен быть быстрее с этим в качестве первичного ключа, чем при создании отдельного индекса.

0 голосов
/ 10 марта 2019

Первая идея - использовать LIMIT по вашему запросу

SELECT * FROM minutely WHERE ticker="AAPL" LIMIT 256;

Это обеспечивает завершение команды SELECT без проверки всей таблицы. 256 - пример максимального ожидаемого числа строк, которое вы можете получить.

Если вы не знаете LIMIT, сначала проверьте его, и сделайте это после возможности ожидаемого более высокого значения строки с тем же тикером .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...