MySQL中'flag is TRUE'和'flag=TRUE'有什么区别?

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运算符用于根据某个值测试该值是否为真、假或未知 从文件: 是布尔值 根据布尔值测试值,其中布

我在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运算符用于根据某个值测试该值是否为真、假或未知
  • 从文件:
    是布尔值

    根据布尔值测试值,其中布尔值可以为真、假或未知

    mysql>SELECT 1为真,0为假,NULL未知; ->1,1,1

    对于“=”运算符,它只是一种将要比较的内容等同起来的方法。在查询中,您正在使用valid将其设置为True


    因此,根据您的用例,您将使用操作符。在您当前的查询中,它们看起来好像做了相同的事情。

    两者之间存在语义差异

  • IS运算符用于根据某个值测试该值是否为真、假或未知
  • 从文件:
    是布尔值

    根据布尔值测试值,其中布尔值可以为真、假或未知

    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