SQLite: ¿Quiere LIKE 'searchstr%' usar un índice?

Tengo una database con varios campos

word_id — INTEGER PRIMARY_KEY word — TEXT ... 

..y ~ 150k filas.

Como este es un dictionary, estoy buscando una palabra con la máscara 'search_string%' usando LIKE. Solía ​​funcionar bien, tardando 15 ms para encontrar filas coincidentes. La tabla tiene un índice para un campo 'word' . Recientemente modifiqué la tabla (algunos campos de esa tabla están fuera del scope) y sucedió algo: está tardando 400 ms en ejecutar la consulta, así que lo entiendo porque ahora no puede usar el índice. La consulta directa con = en lugar de como muestra el resultado de 10ms. ¿Alguien tiene una idea de lo que está pasando aquí?

Un índice no se puede usar con security en este caso. Una implementación ingenua transformaría esto:

... WHERE word LIKE 'search_string%'

dentro

... WHERE word >= 'search_string' AND word < 'search_strinh'

al incrementar el último carácter de la cadena de búsqueda. Los operadores mayor que y menor que pueden usar un índice, donde LIKE no puede.

Desafortunadamente, eso no funcionará en el caso general. El operador LIKE no distingue entre mayúsculas y minúsculas, lo que significa que 'a' LIKE 'A' es verdadero. La transformación anterior rompería cualquier cadena de búsqueda con letras mayúsculas.

En algunos casos, sin embargo, usted sabe que la sensibilidad de mayúsculas y minúsculas es irrelevante para una columna en particular, y la transformación anterior es segura. En este caso, tienes dos opciones.

  1. Use la secuencia de sorting NOCASE en el índice que cubre este campo en particular.
  2. Cambie el comportamiento del operador LIKE progtwig ejecutando PRAGMA case_sensitive_like = ON;

Cualquiera de estos comportamientos permitirá a SQLite realizar de forma transparente la transformación anterior para usted; simplemente sigue usando LIKE como siempre, y SQLite reescribirá la consulta subyacente para usar el índice.

Puede leer más acerca de "La optimization LIKE" en la página de resumen de SQLite Query Optimizer .

    Intereting Posts