LIKE
не получит выгоды от индекса (с параметром по умолчанию), но вы можете переписать свой запрос, используя GLOB
или BETWEEN
.
РЕШЕНИЕ 1
С регулярным индексом:
подобно => не оптимизировано
sqlite> explain query plan select * from pathdta where path like '/path/to/some/dir/a%' ;
0|0|0|SCAN TABLE pathdta
GLOB => оптимизировано
sqlite> explain query plan select * from pathdta where path GLOB '/path/to/some/dir/a*' ;
0|0|0|SEARCH TABLE pathdta USING COVERING INDEX ix_pathdta_dta (path>? AND path<?)
больше => оптимизировано
sqlite> explain query plan select * from pathdta where path >= '/path/to/some/dir/a' ;
0|0|0|SEARCH TABLE pathdta USING COVERING INDEX ix_pathdta_dta (path>?)
равенство => оптимизировано
sqlite> explain query plan select * from pathdta where path = '/path/to/some/dir/a' ;
0|0|0|SEARCH TABLE pathdta USING COVERING INDEX ix_pathdta_dta (path=?)
между => оптимизировано
sqlite> explain query plan select * from pathdta
...> where path between '/path/to/some/dir/a' and '/path/to/some/dir/b' ;
0|0|0|SEARCH TABLE pathdta USING COVERING INDEX ix_pathdta_dta (path>? AND path<?)
РЕШЕНИЕ 2
используйте индекс collate nocase
.
как => оптимизировано
sqlite> explain query plan select * from pathdta where path like '/path/to/some/dir/a%' ;
0|0|0|SEARCH TABLE pathdta USING COVERING INDEX ix_pathdta_dta (path>? AND path<?)
glob => не оптимизировано
sqlite> explain query plan select * from pathdta where path GLOB '/path/to/some/dir/a*' ;
0|0|0|SCAN TABLE pathdta
больше => не оптимизировано
sqlite> explain query plan select * from pathdta where path >= '/path/to/some/dir/a' ;
0|0|0|SCAN TABLE pathdta
равенство => не оптимизировано
sqlite> explain query plan select * from pathdta where path = '/path/to/some/dir/a' ;
0|0|0|SCAN TABLE pathdta
между => не оптимизировано
sqlite> explain query plan select * from pathdta
...> where path between '/path/to/some/dir/a' and '/path/to/some/dir/b' ;
0|0|0|SCAN TABLE pathdta