una parcial hacer datos como coincidencias busqueda buscarv buscar algoritmo mysql string performance

parcial - hacer un buscarv en mysql



Usando LIKE vs.=para una coincidencia de cadena exacta (2)

En primer lugar, reconozco las diferencias entre los dos:
- Like pone a disposición los comodines% y _
- espacio en blanco significativo al final
- problemas de colación

En igualdad de condiciones, para una coincidencia de cadena exacta que sea más eficiente:

SELECT field WHERE ''a'' = ''a'';

O:

SELECT field WHERE ''a'' LIKE ''a'';

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


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.


En un DBMS decente, el motor de DB reconocería que no había caracteres comodín en la cadena y lo convertiría implícitamente en una igualdad pura (no necesariamente igual a = ). 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 necesariamente actúa de la manera esperada (como una verificación de igualdad pura). Específicamente, no tiene en cuenta por defecto los espacios finales para los datos CHAR y VARCHAR , lo que significa que:

SELECT age WHERE name = ''pax''

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

Si desea hacer una verificación de igualdad adecuada , use la palabra clave binary :

SELECT field WHERE name = binary ''pax''

Puedes 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