У меня следующий запрос:
SELECT *
from stop_times
WHERE (departure_time BETWEEN '02:41' AND '05:41'
OR departure_time BETWEEN '26:41' AND '29:41')
AND stop_times.stop_id IN(51511,51509,51508,51510,6,53851,51522,51533)
, который возвращает 134 строки в ~ 800 мс.Если я разделю его:
SELECT *
from stop_times
WHERE (departure_time BETWEEN '02:41' AND '05:41'
OR departure_time BETWEEN '26:41' AND '29:41')
возвращает ~ 110 тыс. Строк за ~ 10 мс, а
SELECT *
from stop_times
WHERE stop_times.stop_id IN(51511,51509,51508,51510,6,53851,51522,51533)
возвращает ~ 5 тыс. Строк за ~ 100 мс.
Я попытался использовать обамногостолбцовый индекс (выезд-время и стоп-идентификатор), а также 2 отдельных индекса, но в любом случае первый запрос не может занять менее ~ 800 мс.Моя таблица stop_times содержит около 3,5 миллионов строк.Могу ли я что-то упустить, и это значительно ускорит этот первый запрос?
ОБНОВЛЕНИЕ 1: ПОКАЗАТЬ СОЗДАНИЕ ТАБЛИЦЫ:
CREATE TABLE `stop_times` (
`trip_id` varchar(20) DEFAULT NULL,
`departure_time` time DEFAULT NULL,
`stop_id` varchar(20) DEFAULT NULL,
KEY `index_stop_times_on_trip_id` (`trip_id`),
KEY `index_stop_times_on_departure_time_and_stop_id` (`departure_time`,`stop_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
stop_id и trip_id - varcharsвместо целых чисел, к сожалению, вне моего контроля ...
ОБНОВЛЕНИЕ 2: EXPLAIN
для departure_time, stop_id
многостолбцовый индекс:
select_type: SIMPLE
type: range
rows: 239084
EXPLAIN
для stop_id, departure_time
многостолбцовый индекс:
select_type: SIMPLE
type: range
rows: 141
ОБНОВЛЕНИЕ 3: EXPLAIN
для IN(51511,51509,51508,51510,6,53851,51522,51533)
select_type: SIMPLE
type: ALL
rows: 3556973 (lol)
EXPLAIN
для IN("51511","51509","51508","51510","6","53851","51522","51533")
select_type: SIMPLE
type: range
rows: 141