【问题标题】:mysql boolean on where clausemysql boolean on where 子句
【发布时间】:2015-12-08 05:43:15
【问题描述】:

我想知道哪个更快?

SELECT * FROM `table` WHERE `is_deleted` = false;

SELECT * FROM `table` WHERE NOT `is_deleted`

谢谢

【问题讨论】:

  • 不确定,但我猜查询优化器会将这两个查询视为等价的。
  • 第二个查询真的有效吗?
  • 是的,第二个查询是有效的。

标签: mysql boolean where-clause


【解决方案1】:

架构

create table t123
(
    id int auto_increment primary key,
    x boolean not null,
    key(x)
);
truncate table t123;
insert t123(x) values (false),(true),(false),(true),(false),(true),(false),(true),(false),(true),(false),(true);
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;
insert t123(x) select (x) from t123;

select count(*) as rowCount from t123;
+----------+
| rowCount |
+----------+
|  3145728 |
+----------+

我们现在有 310 万行。

一个

explain SELECT * FROM t123 WHERE x=false;

+----+-------------+-------+------+---------------+------+---------+-------+---------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows    | Extra       |
+----+-------------+-------+------+---------------+------+---------+-------+---------+-------------+
|  1 | SIMPLE      | t123  | ref  | x             | x    | 1       | const | 1570707 | Using index |
+----+-------------+-------+------+---------------+------+---------+-------+---------+-------------+

B

explain SELECT * FROM t123 WHERE NOT `x`;

+----+-------------+-------+-------+---------------+------+---------+------+---------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows    | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+------+---------+--------------------------+
|  1 | SIMPLE      | t123  | index | NULL          | x    | 1       | NULL | 3141414 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+---------+--------------------------+

所以A 更快,因为它能够使用本机数据类型(如在具有它的索引中所见),并且由于B 处理数据转换的方式而不会强制进行表扫描(并且确实会导致表扫描)

它的证明在explain 输出中,确定答案所需的rows 的数量,并且即使在两者的列上都没有使用索引(ref 列)查询。

Explain Syntax 的 Mysql 手册页。

【讨论】:

    【解决方案2】:

    table 中选择 * 而不是is_deleted

    此查询将为您提供更快、更合适的结果。

    因为在 Mysql 中,布尔数据类型最好使用 Not 运算符。

    【讨论】:

    • 很抱歉复活这个,但是你有任何证据吗?根据上面的答案和我的测试,它会导致全表扫描,这不好。那么如何证明它更快,appropriate result 是什么意思?
    猜你喜欢
    • 2021-09-29
    • 2017-11-19
    • 2021-05-30
    • 1970-01-01
    • 2021-12-04
    • 2010-11-04
    • 1970-01-01
    • 2021-10-13
    • 2019-10-04
    相关资源
    最近更新 更多