在过去的几天里,我发现了一些奇怪的优化我的查询.我有一个简单的查询,它具有以下特点:
   SELECT id,name,amount FROM reservations WHERE NOT canceled ORDER BY name ASC
我注意到mysql没有使用任何索引,所以我开始做一些实验.无意中我将"NOT cancel"替换为"cancelled = false",然后,Mysql开始使用"cancelled"作为索引.之后我尝试使用相反的方法:
   SELECT ... FROM reservations WHERE canceled ORDER BY ...
结果相同!当我将其更改为"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 ;
我对MYSQL不熟悉,但逻辑思考,我是这样理解的:
索引就像一本电话簿,当你搜索“Cohen”时,你可以立即找到它。
但如果您要查找的不是“Cohen”,则必须遍历每个条目,并检查它是否与“Cohen”不同。
所以当你寻找特定的价值时,它就会寻找它。当您使用NOT时,它会查找可以放入其中的任何其他值tinyint(1)(据我所知,它不仅是1or 0,是吗?)。
| 归档时间: | 
 | 
| 查看次数: | 314 次 | 
| 最近记录: |