operador - ¿Qué consulta SQL es mejor, ENFRENTAR O SIMILAR?
operador like sql server (1)
Actualizar
A partir de MySQL 5.6
y posterior, las tablas de InnoDB
compatibles con Match... Against
.
El primero es mucho mejor. En las tablas MyISAM usará un índice de texto completo contra esas columnas. El otro hará un escaneo completo de la tabla haciendo un concat en cada fila y luego una comparación.
LIKE
solo es eficiente si lo haces en contra:
- una columna (no un resultado de una función a menos que su proveedor de base de datos en particular admita índices funcionales, por ejemplo, Oracle, y los esté usando);
- el comienzo de la columna (es decir,
LIKE ''blah%''
en oposición aLIKE ''%blah%''
); y - una columna que está indexada.
Si alguna de esas condiciones no es cierta, la única forma de que el motor SQL ejecute la consulta es haciendo un escaneo completo de la tabla. Esto puede ser utilizado en alrededor de 10-20 mil filas. Más allá de eso, rápidamente se vuelve inutilizable sin embargo.
Nota: Un problema con MATCH en MySQL es que parece coincidir solo con palabras completas, por lo que una búsqueda de ''bla'' no coincidirá con una columna con un valor de ''blah'', pero una búsqueda de ''bla *'' lo hará.
Para buscar en la base de datos las filas que tienen ambas palabras clave "foo" Y "barra" en cualquiera de las columnas "foo_desc" y "bar_desc", me gustaría hacer algo como:
SELECT *
FROM t1
WHERE MATCH (t1.foo_desc, t2.bar_desc) AGAINST (''+foo* +bar*'' IN BOOLEAN MODE)
o
SELECT *
FROM t1
WHERE (CONCAT(t1.foo_desc, t2.bar_desc) LIKE ''%foo%'') AND (CONCAT(t1.foo_desc, t2.bar_desc) LIKE ''%bar%'')
Espero que la desventaja de la última consulta sea el rendimiento.
Lo bueno es que la consulta LIKE encuentra ''xxfoo'' donde no sucede MATCH AGAINST.
¿Cuál es el preferido o hay una mejor solución?