关于 MySQL 的唯一索引有个问题想请教一下。唯一索引是允许多个 null 值存在的,这样不是就不符合唯一性的约束了吗?猜想 MySQL 应该是有另外的机制处理多个 null,想请教一下这个机制是什么? 另外,null 值是不是也存储在 b+树里面呢?如果是的话,那查找的时候 null 值怎么用二分法查找呢?
1
kefirzhang 2020-06-05 15:24:02 +08:00
单列索引不存储 null 值,复合索引不存储全为 null 的值
|
2
kefirzhang 2020-06-05 15:29:52 +08:00 1
就是说如果是 null 索引树里面没有这个点,查询的时候 =null 并不会查出来数据
SELECT * FROM `tbUniq` WHERE `name`=NULL 空 要用 is null SELECT * FROM `tbUniq` WHERE `name` is NULL is null 不用索引检索 |
3
ab11800222 2020-06-05 15:48:48 +08:00
null 是未知、未确定的意思,本身不代表任何一个值,既然不算一个值,也就不存在两个 null 值相等的说法,所以不算破坏唯一性约束
|
4
yumenawei 2020-06-05 15:56:10 +08:00
@kefirzhang #2 请教下,如果索引树没存的话,是存在哪里呢?有一个单独的结构吗?
|
5
wy315700 2020-06-05 16:02:24 +08:00
MySQL 里 null 不等于 null
|
6
kefirzhang 2020-06-11 17:29:39 +08:00
@yumenawei 个人理解 就是不存,他不在索引树里面不能作为索引 key,只能当成数据存储
|
7
yumenawei 2020-06-11 17:33:47 +08:00
@kefirzhang #6 那如果我查找为 null 的值,不能走索引,只能扫全表?感觉不是很合理呀
|