query - SQLite: ¿Quiere LIKE ''searchstr%'' usar un índice?
sqlite query android (1)
Un índice no se puede usar con seguridad 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.
- Use la secuencia de clasificación
NOCASE
en el índice que cubre este campo en particular. - Cambie el comportamiento del operador
LIKE
programa ejecutandoPRAGMA 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 optimización LIKE" en la página de resumen de SQLite Query Optimizer .
Tengo una base de datos con varios campos
word_id — INTEGER PRIMARY_KEY
word — TEXT
...
..y ~ 150k filas.
Como este es un diccionario, 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 que están fuera del alcance) 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í?