MySQL中IS NULL、IS NOT NULL、!=不能用索引?胡扯![转载]

原文地址:https://juejin.im/post/6844903921450745863

画重点:
1. 那对于索引列值为NULL的二级索引记录来说,它们被放在B+树的哪里呢?答案是:放在B+树的最左边
"We define the SQL null to be the smallest possible value of a field."

2. 那既然IS NULLIS NOT NULL!=这些条件都可能使用到索引,那到底什么时候索引,什么时候采用全表扫描呢?

答案很简单:成本

成本组成主要有两个方面:

  • 读取二级索引记录的成本

  • 将二级索引记录执行回表操作,也就是到聚簇索引中找到完整的用户记录的操作所付出的成本。

很显然,要扫描的二级索引记录条数越多,那么需要执行的回表操作的次数也就越多,达到了某个比例时,使用二级索引执行查询的成本也就超过了全表扫描的成本(举一个极端的例子,比方说要扫描的全部的二级索引记录,那就要对每条记录执行一遍回表操作,自然不如直接扫描聚簇索引来的快)。

 
MySQL中决定使不使用某个索引执行查询的依据很简单:就是成本够不够小。而不是是否在WHERE子句中用了IS NULLIS NOT NULL!=这些条件。 
 
 
 
 
 
posted @ 2020-09-24 20:26  轨迹320  阅读(286)  评论(0编辑  收藏  举报