我想知道哪个更快?
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/