MySQL中'flag is TRUE'和'flag=TRUE'有什么区别?
我在MySQL中运行了以下查询-MySQL中'flag is TRUE'和'flag=TRUE'有什么区别?,mysql,sql,optimization,indexing,Mysql,Sql,Optimization,Indexing,我在MySQL中运行了以下查询- SELECT * from table WHERE valid is TRUE ORDER BY priority DESC limit 10 offset 0; 所用时间=1秒 vs 所用时间=66毫秒 我在(valid,priority)和(valid)上有索引。 为什么会有如此巨大的差异? is TRUE与=TRUE之间有什么区别?两者之间有语义上的区别 IS运算符用于根据某个值测试该值是否为真、假或未知 从文件: 是布尔值 根据布尔值测试值,其中布
SELECT * from table
WHERE valid is TRUE
ORDER BY priority DESC
limit 10
offset 0;
所用时间=1秒
vs
所用时间=66毫秒
我在(valid,priority)和(valid)上有索引。
为什么会有如此巨大的差异?
is TRUE与=TRUE之间有什么区别?两者之间有语义上的区别
是布尔值
根据布尔值测试值,其中布尔值可以为真、假或未知
mysql>SELECT 1为真,0为假,NULL未知;
->1,1,1
对于“=”运算符,它只是一种将要比较的内容等同起来的方法。在查询中,您正在使用valid将其设置为True
因此,根据您的用例,您将使用操作符。在您当前的查询中,它们看起来好像做了相同的事情。两者之间存在语义差异
是布尔值
根据布尔值测试值,其中布尔值可以为真、假或未知
mysql>SELECT 1为真,0为假,NULL未知;
->1,1,1
对于“=”运算符,它只是一种将要比较的内容等同起来的方法。在查询中,您正在使用valid将其设置为True
因此,根据您的用例,您将使用操作符。在您当前的查询中,它们看起来好像做了相同的事情。根据Mysql for IS操作符
是布尔值
根据布尔值测试值,其中布尔值可以为真、假或未知
在SQL中,布尔值(TRUE、FALSE或UNKNOWN)是真值。使用IS运算符时,测试所针对的值必须表示/转换为这些真值之一,然后对表达式求值
在第一个查询中:
从表中选择*,其中valid为TRUE,ORDER BY priority DESC limit 10 offset 0代码>
根据有效列的数据类型,将为每行计算真值,这将导致全表扫描,因此您将看到更高的次数
在第二个查询中:
从表中选择*,其中valid=TRUE ORDER BY priority DESC limit 10 offset 0代码>
当您使用=operator时,您正在将有效列与TRUE进行比较,TRUE只是1的一个MySQL常量。根据MySQL for is操作符
是布尔值
根据布尔值测试值,其中布尔值可以为真、假或未知
在SQL中,布尔值(TRUE、FALSE或UNKNOWN)是真值。使用IS运算符时,测试所针对的值必须表示/转换为这些真值之一,然后对表达式求值
在第一个查询中:
从表中选择*,其中valid为TRUE,ORDER BY priority DESC limit 10 offset 0代码>
根据有效列的数据类型,将为每行计算真值,这将导致全表扫描,因此您将看到更高的次数
在第二个查询中:
从表中选择*,其中valid=TRUE ORDER BY priority DESC limit 10 offset 0代码>
当您使用=operator时,您将有效列与TRUE进行比较,这只是1的MySQL常量。有一个非常重要的区别:
为TRUE
仅TRUE为“TRUE”或“false”
=TRUE
可以返回NULL
尤其是NULL为TRUE
返回“false”
实际上,这并不重要,因为是真的。不正确
与不正确
或正确
有很大区别
也就是说,是真的
和不是真的
是“空安全的”:
其中NULL不是TRUE-->计算结果为TRUE,并返回所有行
其中NOT NULL-->的计算结果为NULL,不返回任何行
其中NULL TRUE-->的计算结果为NULL,不返回任何行
此处的NULL
可能是一个返回NULL
值的表达式
这些语义在中有明确的解释。有一个非常重要的区别:
为TRUE
仅TRUE为“TRUE”或“false”
=TRUE
可以返回NULL
尤其是NULL为TRUE
返回“false”
实际上,这并不重要,因为是真的。不正确
与不正确
或正确
有很大区别
也就是说,是真的
和不是真的
是“空安全的”:
其中NULL不是TRUE-->计算结果为TRUE,并返回所有行
其中NOT NULL-->的计算结果为NULL,不返回任何行
其中NULL TRUE-->的计算结果为NULL,不返回任何行
此处的NULL
可能是一个返回NULL
值的表达式
这些语义在中有明确的解释。记住,您可以始终执行EXPLAIN EXTENDED[您的查询]
然后执行SHOW WARNINGS
要了解“幕后”发生了什么,请点击这里,谢谢@草莓。到目前为止,我只使用了EXPLAIN
。除了针对NULL
进行测试外,请避免使用IS
。这里的答案解释了为什么。请记住,您总是可以执行explain EXTENDED[您的查询]
,然后执行SHOW WARNINGS
要了解“幕后”发生了什么,请点击这里,谢谢@草莓。我只是在用
SELECT * from table
WHERE valid = TRUE
ORDER BY priority DESC
limit 10
offset 0;
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 returned