2008-11-03 9 views
6

Quiero buscar en una tabla para encontrar todas las filas donde un campo en particular tiene uno de dos valores. Sé exactamente cuáles serían los valores, pero me pregunto cuál es la forma más eficiente de buscarlos:Usando IN o una búsqueda de texto

a modo de ejemplo, los dos valores son "puntos x" y "puntos". Sé con certeza que no habrá otros valores de ese campo que tiene "puntos" al final, por lo que las dos consultas que estoy considerando son:

WHERE `myField` IN ('xpoints', 'ypoints') 
--- or... 
WHERE `myField` LIKE '_points' 

lo que dará los mejores resultados en este caso?

Respuesta

14

Como siempre con las consultas SQL, ejecútelo a través del generador de perfiles para averiguarlo. Sin embargo, mi instinto me diría que la búsqueda IN sería más rápida. Especialmente en el ejemplo que usted dio, si el campo estuviera indexado, solo tendría que hacer 2 búsquedas. Si realizó una búsqueda similar, es posible que tenga que realizar un análisis porque está buscando registros que finalizan con un cierto valor. También sería más preciso ya que LIKE '_points' también podría devolver 'gpoints', o cualquier otra cadena similar.

+0

Por supuesto, dependerá del tamaño real de la tabla ... Si es pequeña, el optimizador simplemente elegirá una exploración de tabla. –

1

A menos que todos los elementos de datos en la columna en cuestión comiencen con 'x' o 'y', creo que IN siempre le dará una mejor consulta. Si está indexado, como señala @Kibbee, solo tendrá que realizar 2 búsquedas para obtener ambos. Alternativamente, si no está indexado, un escaneo de tabla usando IN solo tendrá que verificar la primera letra la mayor parte del tiempo, mientras que con LIKE tendrá que verificar dos caracteres cada vez (suponiendo que todos los elementos tienen al menos 2 caracteres) - desde el primer personaje puede ser cualquier cosa.

0

Pruébalo y mira. Cree una gran cantidad de datos de prueba. Además, pruébelo con y sin un índice en myfield. Mientras lo hace, vea si hay una diferencia notable entre LIKE 'points' y LIKE 'xpoint'.

Depende de lo que el optimizador haga con cada consulta.

Para pequeñas cantidades de datos, la diferencia será insignificante. Haga lo que tenga más sentido. Para grandes cantidades de datos, la cantidad de E/S de disco importa mucho más que la cantidad de tiempo de CPU.

Estoy apostando a que IN obtendrá mejores resultados que LIKE, si hay un índice en myfield. También estoy apostando a que 'xpoint_' corre más rápido que '_points'. Pero no hay nada como intentarlo tú mismo.

0

MySQL no puede usar un índice cuando usa comparaciones de cadenas como LIKE '% foo' o '_foo', pero puede usar un índice para comparaciones como 'foo%' y 'foo_'.

Por lo tanto, en su caso, IN será mucho más rápido si se asume que el campo está indexado.

Si está trabajando con un conjunto limitado de valores posibles, vale la pena especificar el campo como un ENUM - MySQL lo almacenará internamente como un número entero y hará que este tipo de búsqueda sea mucho más rápido y ahorrará espacio en disco.

0

Será más rápido hacer la versión IN que la versión LIKE. Especialmente cuando su comodín no está al final de la comparación, pero incluso en condiciones ideales, IN aún sería ideal hasta que su consulta se acerque al tamaño de su inserción de consulta máxima.

Cuestiones relacionadas