SQLite: оптимизировать сканирование таблицы - PullRequest
1 голос
/ 25 сентября 2011

В моей таблице есть несколько столбцов, у которых нет индекса, поиск значения в этих столбцах может занять очень много времени, поскольку SQLite выполняет полное сканирование таблицы.

В моем конкретном случае строка I 'поиск (значения уникальны) почти всегда входит в число последних вставленных.

Я подозреваю, что SQLite начинается с самой старой (первой) строки при сканировании, есть ли способ указать SQLite выполнитьсканирование таблицы в обратном порядке?

ОБНОВЛЕНИЕ: Я нашел это в журнале изменений:

Теперь оптимизатор будет сканировать таблицы в обратном порядкебудет удовлетворять предложению ORDER BY ... DESC.

Так что, возможно, это означает, что я могу просто добавить предложение ORDER BY, чтобы ускорить его.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Решение было:

ORDER BY rowid DESC LIMIT 1

Это сделало молниеносный поиск быстро!

1 голос
/ 25 сентября 2011

Порядок сканирования (самый старый-самый младший или самый младший-самый старый) не имеет значения, поскольку требуется полное сканирование таблицы.Каждый ряд должен быть посещен.Хотя вы упоминаете « строку, которую я ищу», условие

                    .... where col = 'a'

может возвращать одну строку или 10 или 500 строк.SQLite не может просто остановиться и назвать это работой хорошего дня, когда встречается первая подходящая строка, если вы не используете директиву LIMIT.

РЕДАКТИРОВАТЬ: Однако вы можете использовать столбец меток времени, проиндексировать его изатем используйте встроенное представление для получения относительно недавних строк:

              select * from
              (
               select * from T 
               where datecreated > {somerecentdate}
              ) as myView
              where myView.someColumn = 'a'

или просто

            select * from T where datecreated > {some date} and somecolumn = 'a'

Такой подход может быть итеративным процессом - если не возвращаются строки, вам может понадобитьсязапрос с более широким временным окном.Но если вы собираетесь индексировать дату создания, вы можете также проиндексировать [someColumn].

...