惊天大秘密——主键索引和非主键索引不存储在一个B+树里面

每天get到一个新知识点

主键索引和非主键索引并不在一个B+树里面。

主键索引B+树的非叶子节点存放的是主键列的值,叶子节点存放的是数据。

非主键索引B+树的非叶子节点存放的是索引列的值,叶子节点里面只存放了主键。

创建非主键索引就是在创建一个新的B+树。

索引类型见Mysql中的那些索引-CSDN博客

并且,,每建一个索引就是新建一个索引B+树。

打个比方(没打"比方",举个例子)

比如,拿字典来说,第一本字典,从前到后是有顺序的(主键索引是有顺序的),并且每页有页码(非叶子节点的索引值)和内容(叶子节点的数据),假如你只有这一本字典,你查东西是不是要慢很多啊,这不就是慢查场景和sql优化问题吗?

怎么解决呢?

那再建一本字典(索引B+树),这个字典我每页只存放第一本字典的页码(非主键索引叶子节点存的是主键),每页也有一个页码(非主键索引的列的值),假如说索引字段是一个状态字段,状态只有有效1和失效0,状态为0的在一页,状态为1的在一页。

现在,我要找有效的1。

我先去1的那一页去查它的页码(主键),带着主键再直接去第一本字典去查,就能很快找到想要的数据。

这一步也是解决慢查和sql优化的一种方式(建立索引),更是回表的场景,回表可能也会导致慢查,如果是回表导致的慢查,就只能从减少回表的次数上去优化。

减少回表

使用覆盖索引,需要查询的列作为索引。

使用复合索引,前提是查询经常涉及多个列。

避免使用select *全表查,改为查需要的列字段。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值