MYSQL - NOT vs var = false

Pho*_*nix 11 mysql sql

在过去的几天里,我发现了一些奇怪的优化我的查询.我有一个简单的查询,它具有以下特点:

   SELECT id,name,amount FROM reservations WHERE NOT canceled ORDER BY name ASC
Run Code Online (Sandbox Code Playgroud)

我注意到mysql没有使用任何索引,所以我开始做一些实验.无意中我将"NOT cancel"替换为"cancelled = false",然后,Mysql开始使用"cancelled"作为索引.之后我尝试使用相反的方法:

   SELECT ... FROM reservations WHERE canceled ORDER BY ...
Run Code Online (Sandbox Code Playgroud)

结果相同!当我将其更改为"cancelled = true"时,索引再次起作用.

我的问题是:怎么样?!是不是使用"NOT"的"优雅"方式?无论如何,我没想到它会有任何不同.

我使用InnoDB作为引擎,但我使用MyISAM获得相同的结果.有人能澄清一切吗?谢谢.

编辑:表结构

CREATE TABLE `reservations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trip_code` varchar(10) DEFAULT NULL,
  `departure_date` date DEFAULT NULL,
  `amount` float DEFAULT NULL,
  `name` varchar(45) DEFAULT NULL,
  `canceled` tinyint(1) NOT NULL DEFAULT '0',
  `created_date` date NOT NULL,
  `creator_user` int(11) NOT NULL DEFAULT '1',
  `last_update_user` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `trip_code` (`trip_code`),
  KEY `departure_date` (`departure_date`),
  KEY `created_date` (`created_date`),
  KEY `canceled` (`canceled`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=123181 ;
Run Code Online (Sandbox Code Playgroud)

Ole*_*hko 2

我对MYSQL不熟悉,但逻辑思考,我是这样理解的:
索引就像一本电话簿,当你搜索“Cohen”时,你可以立即找到它。
但如果您要查找的不是“Cohen”,则必须遍历每个条目,并检查它是否与“Cohen”不同。
所以当你寻找特定的价值时,它就会寻找它。当您使用NOT时,它会查找可以放入其中的任何其他值tinyint(1)(据我所知,它不仅是1or 0,是吗?)。

  • +1 其实我错了。“WHERE X”将返回 X 值为“2”的行。`WHERE X=true` 则不然。我猜想“true”首先被转换为“int”,然后与该值进行比较,因此这是一个可控制谓词。 (2认同)