programación libro español ejemplos declarar datos con comandos bases mysql postgresql grep ack

mysql - libro - ¿Qué es generalmente más rápido, grepping a través de archivos o ejecutando una consulta SQL LIKE% x% a través de blobs?



sql pdf (4)

Internet parece adivinar que grep usa Boyer-Moore, lo que hará que el tiempo de consulta dependa de manera aditiva (no multiplicativa) en el tamaño de la consulta. Esto no es tan relevante sin embargo.

Creo que es casi óptimo para una búsqueda de una sola vez. Pero en su caso puede hacerlo mejor ya que tiene búsquedas repetidas, que puede explotar la estructura de (por ejemplo, indexando ciertas subcadenas comunes en su consulta), como apunta bpgergo.

Además, no estoy seguro de que el motor de expresiones regulares que está pensando utilizar esté optimizado para una consulta no especial, podría intentarlo y ver.

Es posible que desee mantener en memoria todos los archivos que está buscando para evitar la desaceleración basada en discos duros. Esto debería funcionar a menos que esté buscando una cantidad asombrosa de texto.

Digamos que estoy diseñando una herramienta que podría guardar fragmentos de código en una base de datos PostgreSQL / MySQL o en el sistema de archivos. Quiero buscar a través de estos fragmentos. Usar un motor de búsqueda como Sphinx no parece práctico porque necesitamos coincidencias de texto exactas del código cuando buscamos el código.

grep y ack y siempre funcionó muy bien, pero almacenar cosas en una base de datos hace que una gran colección de cosas sea más manejable de ciertas maneras. Me pregunto cómo se compara el rendimiento relativo de ejecutar grep recursivamente en un árbol de directorios para ejecutar una consulta como LIKE de SQL o la función REGEXP de MySQL sobre un número equivalente de registros con blobs de TEXT.



Si tienes archivos de 1 M para grep, (mejor que yo sepa), revisa cada uno con una expresión regular.

Para todos los efectos, terminará haciendo lo mismo sobre las filas de la tabla si las consulta en masa usando un operador LIKE o una expresión regular.

Mi propia experiencia con grep es que rara vez busco algo que no contenga al menos una palabra completa, sin embargo, por lo que puede aprovechar una base de datos para reducir el conjunto en el que está buscando.

MySQL tiene funciones nativas de búsqueda de texto completo, pero recomiendo que no lo haga porque significa que no está usando InnoDB.

Puedes leer sobre los de Postgres aquí:

http://www.postgresql.org/docs/current/static/textsearch.html

Después de crear un índice en una columna de tsvector, puede hacer su "grep" en dos pasos, uno para encontrar inmediatamente las filas que podrían calificar vagamente, seguido de otro según sus verdaderos criterios:

select * from docs where tsvcol @@ :tsquery and (regexp at will);

Eso será significativamente más rápido que cualquier cosa que grep pueda hacer.