Ejecuté las siguientes consultas en MySQL:
SELECT * from table WHERE valid is TRUE ORDER BY priority DESC limit 10 offset 0;Tiempo empleado = 1 segundo.
contra
SELECT * from table WHERE valid = TRUE ORDER BY priority DESC limit 10 offset 0;Tiempo empleado = 66 ms.
Tengo índices en (válido, prioridad) y (válido). ¿Por qué hay una diferencia tan grande? ¿Cuál es la diferencia entre es VERDADERO y = VERDADERO ?
Según el Mysql Doc para el operador IS
ES valor_booleano
Prueba un valor con un valor booleano, donde boolean_value puede ser VERDADERO, FALSO o DESCONOCIDO.
En SQL, un valor_booleano, ya sea VERDADERO, FALSO o DESCONOCIDO, es un valor de verdad. Cuando se usa el operador IS, el valor con el que se está probando debe expresarse/emitirse como uno de estos valores de verdad, y luego se evalúa la expresión.
En tu primera consulta:
SELECT * from table WHERE valid is TRUE ORDER BY priority DESC limit 10 offset 0;
según el tipo de datos de la columna válida, el valor real se evalúa para cada fila, lo que daría como resultado un análisis completo de la tabla, por lo que vería tiempos más altos.
En tu segunda consulta:
SELECT * from table WHERE valid = TRUE ORDER BY priority DESC limit 10 offset 0;
cuando usa el operador =, está comparando la columna válida con Boolean Literal TRUE, que es solo una constante de MySQL para 1.
Hay una diferencia muy importante:
IS TRUE solo verdaderos "verdadero" o "falso"
= TRUE puede devolver NULL .
En particular, NULL IS TRUE devuelve "falso".
En realidad, esto no es tan importante para IS TRUE . Es una diferencia sustancial para IS NOT TRUE versus NOT o <> true .
Eso IS TRUE y IS NOT TRUE es "NULL-safe":
where NULL IS NOT TRUE --> evaluates to true and all rows are returned where NOT NULL --> evaluates to NULL and no rows are returned where NULL <> TRUE --> evaluates to NULL and no rows are returnedEl NULL aquí podría ser una expresión que devuelve valores NULL .
Esta semántica se explica claramente en la documentación .
Hay una diferencia semántica entre los dos.
De la documentación: IS boolean_value
Prueba un valor con un valor booleano, donde boolean_value puede ser VERDADERO, FALSO o DESCONOCIDO.
mysql> SELECCIONE 1 ES VERDADERO, 0 ES FALSO, NULL ES DESCONOCIDO; -> 1, 1, 1
Para el operador "=", es simplemente una forma de equiparar algo para comparar. En su consulta, está utilizando valid para establecerse en True.
Entonces, dependiendo de su caso de uso, usaría los operadores. En su consulta actual, parece que hacen lo mismo.