读mysql45讲-索引

索引就是为了提高查询的效率

我理解的索引就是将数据按照某种存储方式来存储,这样在查询的时候可以按照存储方式的特性可以更快的查询到想要的数据,
这种特殊的存储方式就是数据结构,常见的数据结构有数组,链表,哈希表,树,队列,栈等等。

哈希表

哈希表是一种以键值(key-value)存储数据的结构。例如key=monday,value=星期一;先根据自定义的哈希函数将monday经过计算得到一个值128,然后在数组array中下标为128的位置存值星期一;但是可能哈希函数会将不同的值经过计算得到一个同样的数字,这个时候就把多个在同样位置的值组成一个链表。
这里经过哈希函数计算得到的值通常不是有顺序的值,好处是在新增的时候就直接计算key然后放到数组里去,比较适合做等值查询;但是如果需要查询一个范围内的值(key=monday,key=friday),就需要把key=monday到key=friday的值都查询一遍。

有序数组

如果是使用有序数组来存储数据的话,区间查询方便,等值查询也是挺方便的。但是在做插入和新增的时候就会比较耗费空间和时间。所以有序数组适合用来存储那些正常不会改变的数据,比如去年小卖部王老吉售出的数量。

数据库底层存储的核心就是基于数据模型,也就是数据结构的实际运用。

InnoDB的索引

在InnoDB中,表都是按照主键顺序以索引的方式来存放的,InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的。
创建一个表:

 create table T( id int primary key, k int not null, name varchar(16), index (k))engine=InnoDB;

在这里插入图片描述

InnoDB的索引类型分为主键索引和非主键索引。
可以看到左侧中主键索引中叶子节点存储的值是整行数据(R1~R5),主键所以也被称为聚簇索引
而右侧中非主键索引叶子节点存储的是ID的值,非主键索引也被称为二级索引。

基于主键索引和普通索引的查询区别:

  • select * from table where id = 5 主键查询,直接搜索主键的索引,也就是主键id构成的B+树
  • select * from table where k=6 普通索引查询,先是查询k这个字段上的值构成的B+树,找到id,然后再去根据id构成的B+树查询整行值。

也就是多了一个步骤,这个过程称为回表,所以查询尽量使用主键查询。

B+树为了维护索引的有序性,所以在插入数据的时候会有维护的操作,例如上面的图中,插入一个id值为400的数据,就需要将id=500,id=600的数据的位置往后挪一下。

正常建表的时候都会将主键设置为自增主键,(即: NOTNULL PRIMARY KEY AUTO_INCREMENT。),这样在插入新数据的时候,就不用指定主键值,数据库会自动获取当前最大主键值然后+1赋值给新的数据。但是也有的表的主键并不是自增的,而是使用有业务逻辑的字段作为主键。
考虑用身份证号来做人员表的主键还是使用自增主键?
如果使用身份证号做主键,那么二级索引存储的值就需要20个字节,但是如果是使用自增主键,那二级索引存储的值就是4字节(int),8字节(bigint),可以看到使用自增主键索引占用的空间还是小一点的。

适合用业务字段作为主键的背景:

  • 只有一个索引
  • 索引是唯一索引

这样的话就不需要考虑二级索引了。但是正常来说还是自增主键方便点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值