SQLite всегда выполняет полное сканирование таблицы, когда используется? - PullRequest
1 голос
/ 23 октября 2009

У меня есть текстовый столбец, содержащий уникальные URL.

Мне нужно выполнить запрос на сопоставление с шаблоном SQL, скажем, используя оператор SQL «like».

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

Похоже, что он выполняет FTS, поскольку скорость работы говорит - или это влияние на скорость из-за запроса "like", хотя столбец проиндексирован?

Ответы [ 3 ]

4 голосов
/ 23 октября 2009

Оператор LIKE выполнит полное сканирование таблицы, если строка операнда начинается с символа подстановки ("LIKE '% foo'"). В противном случае будет использоваться индекс (если имеется).

2 голосов
/ 23 октября 2009

Планировщик запросов SQLite

4.0 LIKE оптимизация

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

  1. В левой части оператора LIKE или GLOB должно быть указано имя индексированный столбец.
  2. Правая часть LIKE или GLOB должна быть строковым литералом, который не начинается с символа подстановки персонаж. [...]

Обновление: по умолчанию case_sensitive_like Режим отключен. Включение может привести к тому, что он будет вести себя как =.

PRAGMA case_sensitive_like = ON; -- OFF
SELECT * FROM your_table WHERE field LIKE '...'
1 голос
/ 23 октября 2009

Если ваш LIKE использует подстановочный знак в начале выражения совпадения, например '%hris McCall', индексы не будут использоваться.

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