No, eso es más o menos lo que están haciendo. Ahora, si no hay un comodín inicial y el campo está indexado, que es la situación habitual, el motor de la base de datos puede aplicar la expresión regular al índice. Entonces, por ejemplo, si escribes
SELECT *
FROM employees
WHERE last_name LIKE 'Cav%'
la base de datos puede usar el índice LAST_NAME
para encontrar todas las filas donde comienza el apellido 'Cav'. Por otro lado, si tuvieras algo como
SELECT *
FROM employees
WHERE last_name LIKE '%av%'
la base de datos tendría que escanear la tabla completa (o el índice completo) y evaluar la expresión contra el LAST_NAME
valor completo . Obviamente, eso es muy caro.
La mayoría de las mejores bases de datos relacionales tienen facilidades para realizar búsquedas de texto completo de una manera más eficiente mediante la construcción de diferentes tipos de índices y catálogos de texto, pero estos no usan la palabra clave LIKE. Por ejemplo, aquí hay un buen artículo que analiza la búsqueda de texto completo en PostgreSQL .
LAST_NAME
ser candidato para (la primera columna) el índice agrupado? pps ¿en qué medida esta respuesta supone que el sistema de base de datos se basa en el almacenamiento contiguo en el disco y los índices del árbol B?Además de lo que escribió Justin Cave, desde PostgreSQL 9.1 puede acelerar cualquier búsqueda con
LIKE
(~~
) oILIKE
(~~*
), y también coincidencias básicas de expresiones regulares (~
). Utilice las clases de operador proporcionadas por el módulo pg_trgm con un índice GIN o GiST para acelerar lasLIKE
expresiones que no están ancladas a la izquierda. Para instalar la extensión, ejecute una vez por base de datos:Crear un índice del formulario
O:
Crear y mantener un índice GIN o GiST conlleva un costo, pero si su tabla no está muy escrita, esta es una gran característica para usted.
Depesz ha escrito un excelente artículo en su blog sobre la nueva característica.
GIN o GiST?
Estas dos citas del manual deberían proporcionar alguna orientación
Pero para el tipo de consultas "vecino más cercano" con el uso del operador de distancia
<->
:fuente
Hablando de MySQL, la posición del carácter comodín (%) hace la diferencia. Si la primera parte del texto se especifica como
where first_name like 'Sta%'
, entonces el motor de base de datos buscará solo un subconjunto más pequeño de palabras con S, luego irá a St, y luego a Sta, etc. Si hace algo asíwhere first_name like '%stan%'
, entonces, y toda la exploración del Se requerirá una columna. También puede buscar índices de texto completo que también realicen búsquedas en lenguaje natural. Echa un vistazo a los documentos de MySQL aquí.fuente