transact query commands sql sqlite cocoa sql-like query-performance

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.

  1. Use la secuencia de clasificación NOCASE en el índice que cubre este campo en particular.
  2. Cambie el comportamiento del operador LIKE programa 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 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í?