原文地址: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 NULL
、IS NOT NULL
、!=
这些条件都可能使用到索引,那到底什么时候索引,什么时候采用全表扫描呢?
答案很简单:成本。
成本组成主要有两个方面:
-
读取二级索引记录的成本
-
将二级索引记录执行回表操作,也就是到聚簇索引中找到完整的用户记录的操作所付出的成本。
很显然,要扫描的二级索引记录条数越多,那么需要执行的回表操作的次数也就越多,达到了某个比例时,使用二级索引执行查询的成本也就超过了全表扫描的成本(举一个极端的例子,比方说要扫描的全部的二级索引记录,那就要对每条记录执行一遍回表操作,自然不如直接扫描聚簇索引来的快)。
MySQL中决定使不使用某个索引执行查询的依据很简单:就是成本够不够小。而不是是否在WHERE子句中用了
IS NULL
、IS NOT NULL
、!=
这些条件。