В этом случае нельзя безопасно использовать индекс.Наивная реализация преобразует это:
... WHERE word LIKE 'search_string%'
в
... WHERE word >= 'search_string' AND word < 'search_strinh'
, увеличивая последний символ строки поиска.Операторы «больше» и «меньше» могут использовать индекс, а LIKE - нет.
К сожалению, в общем случае это не сработает.Оператор LIKE
нечувствителен к регистру, что означает, что 'a' LIKE 'A'
имеет значение true.Вышеупомянутое преобразование будет разбивать любую строку поиска заглавными буквами.
В некоторых случаях, однако, вы знаете , что чувствительность к регистру не имеет значения для определенного столбца, и указанное преобразование безопасно.В этом случае у вас есть две опции.
- Используйте последовательность сортировки
NOCASE
для индекса, который охватывает это конкретное поле. - Измените поведение программы оператора
LIKE
-в целом, запустив PRAGMA case_sensitive_like = ON;
Любое из этих действий позволит SQLite прозрачно выполнить вышеуказанное преобразование для вас;вы просто продолжаете использовать LIKE
как всегда, и SQLite перепишет базовый запрос для использования индекса.
Подробнее о "Оптимизации LIKE" можно прочитать на странице Обзор SQLite Query Optimizer .