Pregunta

¿Alguien sabe cuál es la complejidad para el operador SQL LIKE para las bases de datos más populares?

¿Fue útil?

Solución

Consideremos los tres casos principales por separado. Esta discusión es específica de MySQL, pero también podría aplicarse a otros DBMS debido al hecho de que los índices normalmente se implementan de una manera similar.

LIKE 'foo%' es rápido si se ejecuta en una columna indexada. Los índices de MySQL son una variación de los árboles B, por lo que al realizar esta consulta, simplemente puede descender. el árbol al nodo correspondiente a foo , o el primer nodo con ese prefijo, y atraviesa el árbol hacia adelante. Todo esto es muy eficiente.

LIKE '% foo' no puede ser acelerado por los índices y resultará en un escaneo completo de la tabla. Si tiene otros criterios que pueden ejecutarse utilizando índices, solo escaneará las filas que quedan después del filtrado inicial.

Sin embargo, hay un truco : si necesita hacer una comparación de sufijos, busque nombres de archivo con la extensión .foo , por ejemplo, puede lograr el mismo rendimiento agregando una columna con el mismo contenido que la original pero con los caracteres en orden inverso.

ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);

La búsqueda de filas con col que termina en .foo se convierte en:

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'

Finalmente, hay LIKE '% foo%' , para el cual no hay accesos directos. Si no hay otros criterios limitantes que reduzcan la cantidad de filas a un nivel factible número, va a causar un golpe de rendimiento duro. Es posible que desee considerar una solución de búsqueda de texto completo en su lugar, o alguna otra solución especializada.

Otros consejos

Si está preguntando sobre el impacto en el rendimiento:

El problema de "me gusta" es que evita que la base de datos use un índice. En Oracle, creo que ya no usa índices (pero todavía estoy en Oracle 9). SqlServer usa índices si el comodín está solo al final. No sé sobre otras bases de datos.

¡Depende del RDBMS, los datos (y posiblemente el tamaño de los datos), los índices y cómo se usa el LIKE (con o sin comodín de prefijo)!

Estás haciendo una pregunta demasiado general.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top