MySQL индексы для поиска по диапазонам дат
Есть таблица для хранения диапазонов дат и диапазонов цен. Назначение - хранение скидок или бонусов для заказов в привязке к месяцам и диапазонам стоимостей заказов.
CREATE TABLE `ranges` (
`range_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`range_month_from` date NOT NULL, /* месяц от */
`range_month_to` date NOT NULL, /* месяц до */
`range_order_price_from` int(10) unsigned NOT NULL, /* цена заказа от */
`range_order_price_to` int(10) unsigned NOT NULL, /* цена заказа до */
PRIMARY KEY (`order_price_range_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Нужно для определенного месяца и определённой цены заказа получить строку из таблицы ranges (range_id). Пример запроса для даты '2025-07-01' и стоимости заказ в 10000:
SELECT
r.range_id
FROM
ranges AS r
WHERE
r.range_month_from <= '2025-07-01' AND
r.range_month_to >= '2025-07-01' AND
r.range_order_price_from <= 10000 AND
r.range_order_price_to >= 10000
LIMIT
1;
Количество записей в таблице планируется не большое 20-50 шт. Но эта таблица будет джойниться к большим логам заказов.
Пример лога:
CREATE TABLE `orders` (
`order_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`order_month` date NOT NULL, /* месяц */
`order_price` int(10) unsigned NOT NULL, /* цена заказа */
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Записей в таблице orders много.
Запросы будут примерно такие:
SELECT
...
FROM
(SELECT
o.order_price,
COALESCE(r.range_id, '') AS range_id
FROM
orders AS o
LEFT JOIN ranges AS r ON
o.order_month >= r.range_month_from AND
o.order_month <= r.range_month_to AND
o.order_price >= r.range_order_price_from AND
o.order_price <= r.range_order_price_to
WHERE
...) AS t
...;
В реальности таблиц в запросе больше. Хотелось бы чтобы джойн лога к ranges был по индексам 1 к 1.
Вопросы:
- Какие индексы для таблицы ranges посоветуете?
- Есть ли другие способы хранения диапазонов дат для быстрой выборки? Вариант считать заранее и писать в лог заказов не подходит.
Спасибо!