2009-02-18 10 views
28

Para empezar, que reconocen las diferencias entre los dos:
- Al igual que pone a disposición los comodines% y _
- significativa espacios en blanco finales
- emite colationutilizando como = vs. para el partido de cadena exacta

Todos en igualdad de condiciones, por una coincidencia exacta cadena que es más eficiente:

SELECT field WHERE 'a' = 'a'; 

O:

SELECT field WHERE 'a' LIKE 'a'; 

O: ¿Es la diferencia tan insignificante que no importa?

+4

Baring un completo braindead implementación, el costo de cualquiera de las combinaciones de sabor de cadena va a empequeñecerse por el costo de mover datos del disco. Escribe lo que realmente quieres decir y sigue con la programación. –

+2

Esto se ha cubierto previamente [aquí] (http://stackoverflow.com/questions/543580/equals-vs-like) en stackoverflow. Espero que esto ayude. – user34867

+0

Gracias, he buscado esto antes de publicarlo pero no lo vi de alguna manera. – mluebke

Respuesta

29

Yo diría que el = comparador sería más rápido. El léxico no envía la comparación a otro sistema léxico para hacer coincidencias generales. En cambio, el motor puede igualar o avanzar. Nuestro db en el trabajo tiene millones de filas y an = siempre es más rápido.

3

En un DBMS decente, el motor de base de datos reconocería que no había caracteres comodín en la cadena y lo convertiría implícitamente en una igualdad pura (no necesariamente lo mismo que =). Por lo tanto, solo obtendría un pequeño golpe de rendimiento al principio, generalmente insignificante para cualquier consulta de tamaño decente.

Sin embargo, el operador MySQL = no actúa necesariamente de la manera esperada (como una comprobación de igualdad pura). En concreto, por defecto no tiene en cuenta los espacios finales de CHAR y VARCHAR de datos, lo que significa que:

SELECT age WHERE name = 'pax' 

le dará filas de 'pax', 'pax<one space>' y 'pax<a hundred spaces>'.

Si usted quiere hacer una adecuada verificación la igualdad, se utiliza el binary palabra clave:

SELECT field WHERE name = binary 'pax' 

Puede probar esto con algo como:

mysql> create table people (name varchar(10)); 

mysql> insert into people value ('pax'); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('pax '); 
mysql> insert into people value ('notpax'); 

mysql> select count(*) from people where name like 'pax'; 
1 

mysql> select count(*) from people where name = 'pax'; 
4 

mysql> select count(*) from people where name = binary 'pax'; 
1 
+0

Buena actualización, pero de mayor relevancia para esta pregunta, 'LIKE'" realiza la coincidencia por carácter ", lo que significa que el motor no puede optimizar' LIKE' a '=', por lo que 'LIKE' casi con certeza será más lento. También significa que los dos operadores se comportan de manera diferente dependiendo de la intercalación, pero eso es menos relevante para esta pregunta. – Flimzy

+0

@Flimzy ¿Podría elaborar un poco? AFAIK, '=' realiza una comparación (por supuesto, no coincide) también por carácter, a menos que especifique 'binary' en alguna parte. – Binarus

+1

@Binarus '=' la comparación es diferente para los caracteres compuestos, como 'ä'. Consulte [el manual para obtener detalles] (https://dev.mysql.com/doc/refman/5.7/en/string-comparison-functions.html). – Flimzy

Cuestiones relacionadas