mysql——索引底层原理分析

一、区分几个概念

1、页

1、页号:记录当前是第几页。

2、页目录:记录行数据,标记行开始的最小主键索引数据。

3、行数据:标识每一行的数据。1_111a 标识第一行数据,1_表示主键索引。

行与行数据使用链表有序相连。

4、一页数默认为16k,并且会指向下一页的地址。

2、b+树

多个页相互连接在一起,为了方便查找会再向上生成一个新的类似页的东西,记录页码和每页最小的主键索引,按照这个思路就会生成一颗树,这就是一个b+树。

 

 

 

3、回表,如果是一个聚集索引(abc),在最下面的叶子节点存储的不会是真实数据,而是对应的主键索引,所以如果查询的时候查的数据并非abcd这四个字段,比如查询的是abcde,就需要回表根据主键id继续查询。

select a,b,c,d,e from X where a=1 and b=2 and c=3 and d=e; 是不能利用索引的。

select a,b,c from X where a>1; 是不能利用索引的,因为回表的话会全表扫描。

查询过程会先查询a=1,找到数据后查询后续所有数据。

select a,b,c from X where a>7; 可能会利用索引,因为mysql优化器认为即使回表返回的数据不会很多,效率比全表扫描高一些。

 4、如何建立索引

    ① 索引选择:选择性 = 不重复的记录数 / 总记录数

       选择性的取值范围为(0, 1],选择性越高的索引价值越大。如果选择性等于1,就代表这个列的不重复值和表记录 数是一样的,那么对这个列建立索引是非常合适的,如果选择性非常小,那么就代表这个列的重复值是很多的, 不适合建立索引。

   ② 最左前缀原则

   ③ 1>索引列的类型尽量小

        2>利用索引字符串值的前缀

        3>主键自增

        4>定位并删除表中的重复和冗余索引

       5>尽量使用覆盖索引进行查询,避免回表带来的性能损耗。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值