Эффективное использование двухколоночных диапазонов в SQLite - PullRequest
1 голос
/ 11 октября 2011

У меня есть таблица (start_date, end_date, description) - чтобы найти события, которые происходят в течение определенного периода, я делаю

SELECT *
FROM table
WHERE start_date < $view_end AND end_date > $view_start

Это работает правильно, и многие продукты баз данных смогут использовать индекс по обоим столбцам для эффективного поиска результата - но SQLite поддерживает использование только одного индекса диапазона за раз (я могу сделать много индексированных сравнений, но только один индексируется больше или меньше). В результате, если я хочу просмотреть средние 10 событий в таблице из миллиона, я могу использовать только один индекс, чтобы исключить половину из них, и мне нужно выполнить полное сканирование таблицы для других 500 000.

Есть ли какие-нибудь интересные приемы, которые я могу сделать, чтобы переписать этот запрос эффективным способом, учитывая ограничения SQLite?

1 Ответ

0 голосов
/ 12 октября 2011

Это не так быстро, как если бы вы могли использовать два индекса, но будет гораздо быстрее, чем просто сканирование таблицы во втором столбце:

SELECT *
FROM table
WHERE start_date BETWEEN $view_start AND $view_end AND end_date > $view_start

Это сократит сканирование таблицы только до тех записей, которые начались между диапазоном данных, которые вы ищете (а не до всех записей, которые начались до вашей даты окончания)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...