我在mysql中运行了以下查询-
SELECT * from table
WHERE valid is TRUE
ORDER BY priority DESC
limit 10
offset 0;
所用时间=1秒。
与
SELECT * from table
WHERE valid = TRUE
ORDER BY priority DESC
limit 10
offset 0;
所用时间=66 ms。
我在(valid,priority)和(valid)上有索引。为什么会有如此巨大的差异?是真与=真有什么区别?
3条答案
按热度按时间dwthyt8l1#
根据mysql doc for is operator
是布尔值
根据布尔值测试值,其中布尔值可以是true、false或unknown。
在sql中,布尔值(true、false或unknown)是真值。当使用is运算符时,测试所针对的值必须表示/转换为这些真值之一,然后对表达式求值。
在第一个查询中:
SELECT * from table WHERE valid is TRUE ORDER BY priority DESC limit 10 offset 0;
根据有效列的数据类型,将为每一行计算真值,这将导致全表扫描,因此您将看到更高的时间。在第二个查询中:
SELECT * from table WHERE valid = TRUE ORDER BY priority DESC limit 10 offset 0;
当您使用=运算符时,您将有效列与boolean literal true进行比较,boolean literal true只是1的mysql常量。xienkqul2#
有一个非常重要的区别:
IS TRUE
只有“真”或“假”= TRUE
可以返回NULL
.特别地
NULL IS TRUE
返回“false”。实际上,这对我来说并不重要
IS TRUE
. 对我来说这是一个很大的区别IS NOT TRUE
与NOT
或者<> true
.就是这样
IS TRUE
以及IS NOT TRUE
是“空安全的”:这个
NULL
这可能是一个返回NULL
价值观。文档中清楚地解释了这些语义。
6yjfywim3#
这两者在语义上有区别。
is运算符用于测试某个值是否为真、假或未知。
根据文件:
IS boolean_value
Tests a value against a boolean value, where boolean_value can be TRUE, FALSE, or UNKNOWN.mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1
对于“=”运算符来说,这只是一种将要比较的内容相等的方法。在查询中,您使用的是valid to be set to true。因此,根据您的用例,您将使用操作符。在您当前的查询中,它们看起来好像做了相同的事情。