Представьте себе, что у меня есть таблица, содержит все главы книги и страницы начала / конца из каждой главы.
chapter | start_page | end_page
--------------------------------------
1 | 1 | 24
2 | 25 | 67
3 | 68 | 123
4 | 124 | 244
5 | 245 | 323
Я пытаюсь выяснить, на какой главе случайная страница наступает, давайте скажем, например. Page 215.
Моя первая идея состояла в том, чтобы использовать такое запрос
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
AND `end_page` >= 215
, к сожалению, MySQL не может воспользоваться преимуществами индексов в приведенном выше запросе, который является большой проблемой из-за большого размера моего стола.
После выполнения некоторых исследований я придумал этот запрос, который использует преимущества индексов.
SELECT `chapter`
FROM `book`
WHERE `start_page` <= 215
ORDER BY `start_page` DESC
LIMIT 1
Выпуск теперь я хочу, чтобы способность запросить несколько случайных страниц, все еще используя преимущества индексов. Похоже, что я могу изменить мой последний запрос, поскольку оно так сильно зависит от предельных результатов.
Любой совет будет очень признателен!
Обновление: Благодаря комментарию от Ray Toal у меня есть запрос, который дает мне результаты, которые мне нужны с удивительной производительностью.
SELECT chapter
FROM book
WHERE (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 73) AND end_page >= 73)
OR (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 92) AND end_page >= 92)
OR (start_page = (SELECT max(start_page) FROM book WHERE start_page <= 300) AND end_page >= 300)