Ответ Бенуа верен в том, что BETWEEN сообщает Sqlite, что наступает диапазон, поэтому ему нужно только один раз выполнить поиск по индексу для обоих терминов в выражении AND (в противном случае он будет выполнять поиск по индексу дважды, один раз для левой руки).сторона, и один раз на право).Это сокращает количество записей, просмотренных в два раза.(Если вы запустите EXPLAIN QUERY PLAN в инструменте командной строки sqlite, это ясно покажет это.)
Однако планировщик запросов в Sqlite предпочитает использовать 1 индекс на таблицу.Чтобы обойти это, каноническое решение состоит в том, чтобы явно переписать запрос как серию ВЗАИМОДЕЙСТВУЮЩИХ подвыборов:
SELECT "Bytes Received" FROM t1 WHERE ROWID IN
(SELECT ROWID FROM t1 WHERE filename = 'SE12.log'
INTERSECT
SELECT ROWID FROM t1 WHERE time BETWEEN '11:19:31.18' AND '11:19:36.18'
)
Очевидно, что вы можете добавить дополнительные подвыборы для обработки дополнительных терминов.* Использование INDEXED BY не должно быть необходимым, поскольку это не «механизм подсказок», а жесткое требование (которое приведет к ошибке, если изменение схемы приведет к потере индекса - но, возможно, это то, что вам нужно.)