在where子句上使用mysql boolean

zer*_*r09 4 mysql boolean where-clause

我想知道哪个更快?

SELECT * FROM `table` WHERE `is_deleted` = false;
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM `table` WHERE NOT `is_deleted`
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 5

SELECT*FROM tableWHERE NOTis_deleted

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

因为在Mysql中更好地使用Not运算符来表示布尔数据类型.

  • 很抱歉让这个复活,但你有任何证据吗?根据上面的答案和我的测试,它会导致全表扫描,这并不好。那么你如何证明它更快,你是什么意思```适当的结果```? (3认同)

Dre*_*rew 5

架构

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 |
+----------+
Run Code Online (Sandbox Code Playgroud)

我们现在有3.1M行.

一个

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 |
+----+-------------+-------+------+---------------+------+---------+-------+---------+-------------+
Run Code Online (Sandbox Code Playgroud)

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 |
+----+-------------+-------+-------+---------------+------+---------+------+---------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

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

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

解释语法的 Mysql手册页.