powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Какие существуют техники для оптимизации запросов по диапазону значений
7 сообщений из 7, страница 1 из 1
Какие существуют техники для оптимизации запросов по диапазону значений
    #39819480
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

Есть таблица "schedule" с обычным расписанием.

Таблица с примерно такими полями:
train_number type station time_departure time_arrival

Создал два составных ключа:
type + station + time_departure
type + station + time_arrival


Надо выбирать все рейсы по определенной станции за прошедшие несколько часов и за будущие несколько часов.

Я так понимаю для запросов
Код: sql
1.
SELECT * FROM `schedule` WHERE `type`='arrival' AND `station` ='xxxx'  AND `time_arrival` > 1559037600 AND `time_arrival` < 1559080800 ORDER BY `time_arrival` ASC;



составной ключ работать не будет.


Первый вопрос:
1. Какие существуют техники для оптимизации запросов по диапазону значений ?

Второй вопрос:
2. Работают ли составные индексы для запросов с конструкцией IN() ?

Например я могу добавить поле: event_hours
В это поле я могу записывать значение ЧАСА прибытия или отправления.
Тогда я смогу сделать такие составные ключи:
type + station + event_hours + time_departure
type + station + event_hours + time_arrival

И написать такой запрос:
SELECT * FROM `schedule` WHERE `type`='arrival' AND `station` ='xxxx' AND `event_hours` IN(1559037600, .... ,1559080800) ORDER BY `time_arrival` ASC;

Будет ли работать составной индекс ?
...
Рейтинг: 0 / 0
Какие существуют техники для оптимизации запросов по диапазону значений
    #39819538
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555,

FAQ: Нахождение записей, где заданное значение находится между значениями полей уже прочитали?


andrey-55555Я так понимаю для запросов
Код: sql
1.
SELECT * FROM `schedule` WHERE `type`='arrival' AND `station` ='xxxx'  AND `time_arrival` > 1559037600 AND `time_arrival` < 1559080800 ORDER BY `time_arrival` ASC;

составной ключ работать не будет.Формально - может быть использован имеющийся индекс (type,station,time_arrival). Причем как для доступа к записям, так и для их сортировки.
Будет ли он использован на практике - зависит от многих факторов. Проще проверить, чем гадать. Смотрите план запроса.

andrey-555552. Работают ли составные индексы для запросов с конструкцией IN() ?В принципе работают, но если это не последнее поле в индексе, то последующие поля использоваться уже не будут. Но это не точно, в последних версиях могли исправить.

andrey-55555И написать такой запрос:
SELECT * FROM `schedule` WHERE `type`='arrival' AND `station` ='xxxx' AND `event_hours` IN(1559037600, .... ,1559080800) ORDER BY `time_arrival` ASC;

Будет ли работать составной индекс ?На доступ к записям - возможно, для сортировки - нет.
...
Рейтинг: 0 / 0
Какие существуют техники для оптимизации запросов по диапазону значений
    #39820482
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо,
буду пробовать
...
Рейтинг: 0 / 0
Какие существуют техники для оптимизации запросов по диапазону значений
    #39820616
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft

Подскажите еще такой момент.

Если в запросе:
SELECT * FROM `schedule` WHERE `type`='arrival' AND `station` ='xxxx' AND `event_hours` IN(1559037600, .... ,1559080800) ORDER BY `time_arrival` ASC;

убрать сортировку:
SELECT * FROM `schedule` WHERE `type`='arrival' AND `station` ='xxxx' AND `event_hours` IN(1559037600, .... ,1559080800);

в результатах выборки Mysql сохранит последовательность как в операторе IN ?

То есть вначале будут результаты для 1559037600, а последними будут результаты для 1559080800.

Верно ?


В общем у меня еще идея:

Например я могу добавить поле: event_hours
В это поле я могу записывать значение ЧАСА прибытия или отправления С ТОЧНОСТЬЮ ПО 10 МИНУТ.
Тогда я смогу сделать такие составные ключи:
type + station + event_hours
type + station + event_hours

И написать такой запрос без сортировки:
SELECT * FROM `schedule` WHERE `type`='arrival' AND `station` ='xxxx' AND `event_hours` IN(1559037600, .... ,1559080800);

и если в результатах выборки Mysql сохранит последовательность как в операторе IN

тогда в результатах будут рейсы ОТСОРТИРОВАННЫЕ по 10-и минутным интервалам.

Это конечно не 100% сортировка, но примерная последовательность рейсов будет соблюдена.
...
Рейтинг: 0 / 0
Какие существуют техники для оптимизации запросов по диапазону значений
    #39820619
andrey-55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще вопрос.

Что эффективнее:
сортировка результатов в MySQL
или получить результаты без сортировки и сортировать данные уже в PHP ?


Заранее спасибо.
...
Рейтинг: 0 / 0
Какие существуют техники для оптимизации запросов по диапазону значений
    #39821055
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555 в результатах выборки Mysql сохранит последовательность как в операторе IN ? Нет, не сохранит.
...
Рейтинг: 0 / 0
Какие существуют техники для оптимизации запросов по диапазону значений
    #39821060
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey-55555Что эффективнее:
сортировка результатов в MySQL
или получить результаты без сортировки и сортировать данные уже в PHP ?В MySQL эффективнее, на мой взгляд.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Какие существуют техники для оптимизации запросов по диапазону значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]