where 子句上的 mysql boolean 值

标签 mysql boolean where-clause

我想知道哪个更快?

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

SELECT * FROM `table` WHERE NOT `is_deleted`

谢谢

最佳答案

架构

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 更快,因为它能够使用 native 数据类型(如在具有它的索引中所见),并且由于 B 的方式而不会强制进行表扫描 处理数据转换(并且确实导致表扫描)

它的证明在 explain 输出中,用 rows 的数量来确定答案,并且没有使用索引(ref 列)甚至在两个查询的列上。

Explain Syntax 的 Mysql 手册页.

关于where 子句上的 mysql boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34148826/

相关文章:

php - select 语句之间忽略条件

php - 错误代码 200 phpmyadmin 4.6.0

mysql - 显示Table1中存储的所有数据以及Table2中与Table1相关的最后一条记录

ruby - Ruby 变量赋值中的双管道符号?

python - 在 Python 中使用 cerberus 验证 boolean 值

sql - 如何在 MS-ACCESS 中执行按位运算算法

php - 从 foreach 循环中的数组中提取数据库行

mysql - 子查询 MYSQL 以从服务器选择所有数据库

c - 位比较代码,希望有助于理解它

sql - 多个 SQL Select 具有不同的位置到一个 Select 中