索引的出现实际上是为了提升数据查询的效率,就像书的目录同样算法
提升数据查询效率数据库
一、其缘由是,索引不止在内存中,还要写到磁盘上bash
二、N叉树因为在读写上的性能优势,以及适配磁盘的访问模式,已经被普遍应用在数据库引擎中了性能
三、数据库底层存储的核心就是基于这些数据模型的,每碰到一个新数据库,咱们须要先关注它的数据模型,这样才能从离乱山给分析出数据库的适应场景spa
四、不一样存储引擎的索引的工做方式并不同,而即便多个存储引擎支持同一类型的索引,其底层的实现也可能不一样blog
因为InnoDB存储引擎在MySQL数据库中使用最为普遍,因此下面我就觉得例,和你分析一下其中的索引模型索引
主键索引:主键索引的叶子节点存的是整行的数据(聚簇索引),内存
非主键索引:非主键索引的叶子节点内容是主键的值(二级索引)class
一、主键索引只要搜索ID这个B+Tree便可拿到数据。效率
若是语句是 select * from T where ID=500,即主键查询方式,则只须要搜索 ID 这棵 B+ 树
二、普通索引先搜索索引拿到主键值,再到主键索引树搜索一次(回表)
若是语句是 select * from T where k=k=5,即普通索引查询方式,则须要先搜索 k 索引树,获得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程为回表
也就是说,基于非主键索引的查询须要多扫描一棵树,所以,咱们在应用中应该尽可能使用主键查询
自增主键是指自增列上定义的主键,插入新记录的时候能够不制定ID的值,系统会获取当前ID最大值加1做为下一条记录的ID值
也就是说,自增主键的插入数据模式,正符合咱们前面提到的递增插入的场景。每次插入一条新记录,都是追加操做,都不涉及到挪动其余记录,也不会触发叶子节点的分裂
一个数据页满了,按照B+Tree算法,新增长一个数据页,叫作页分裂,会致使性能降低。空间利用率下降大概50%。
当相邻的两个数据页利用率很低的时候会作数据页合并,合并的过程是分裂过程的逆过程。
分裂合并示意图
因为每一个非主键索引的叶子节点上都有主键的值,
一、若是用身份证号作主键,那么每一个二级索引的叶子节点占用的20个字节,
二、而若是用整型作主键,则只要4个字节,
三、若是是长整型则是8个字节
从性能和存储空间方面考量,自增主键每每是更合理的选择。
一、只有一个索引;
二、改索引必须是惟一索引。
你必定看出来了,这就是典型的KV场景
因为没有其余索引,因此也就不用考虑其余索引的叶子节点大小的问题
这时候咱们就要有限考虑上一段的“尽可能使用主键查询”原则,直接将这个索引设置为主键,能够避免每次查询须要搜索两棵树