Как корректно ограничить выборку в БД?

Есть БД, а в ней таблица с 10 миллионами записей.
Структура таблицы простая - 4 поля (напишу на всякий случай, хотя это не важно).
id - автоинкремент (ключ)
time - число, юникс время (ключ)
ticker - короткая строка, например A (Может тоже сделать ключем т.к. часто идет выборка?)
value - число с плавающей запятой.
Нужно выбирать данные из таблицы (строки) с конца.

Сейчас есть такой запрос.
SELECT `value` FROM `data` WHERE `ticker`='A' ORDER BY `id` DESC LIMIT 1000

Возникает проблема, если в БД нет 1000 строк где ticker=A.
Соответственно MySQL ищет эти строки по всей БД и это долго. Нужно ограничить этот поиск.

Известно что если в последних 200 записях "выше" (DESC ) от места поиска, нет такого тикера, то и записей с такими тикерами больше нет во всей в таблице.

Нашел тикер в 200 записях снизу? Ищи дальше от этого места в следующих 200. Нашел? Дальше от этого места в следующих 200.
Нет? Стоп.

Как корректно ограничить выборку в БД?
Возможно ли тут справится одним sql запросом?

Или всё же нужно писать несколько sql запросов, по алгоритму описанному выше? Запоминать id, отдельным запросом проверять наличие и т.д.
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
RomaZveR
@RomaZveR
CEO AlertMoney, PHP/Golang Developer
На первый взгляд вам просто нужен составной индекс по ticker и id
CREATE INDEX ticker_id_idx ON data(ticker, id);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы