Xing
3 min

索引

为什么要使用索引

索引是存储引擎用户快速找到数据记录的一种数据结构,好比可别的目录。主要目的是减少磁盘IO、增加查询效率

索引的优缺点

优点:降低io成本,增加查询效率 缺点:索引需要额外维护,在新增更新删除数据时会增加耗时 磁盘空间等。

聚簇索引

  • Innodb采用B+Tree结构存储数据。
  • 数据存放在叶子节点,数据间通过单向链表关联。
  • 内节点存放目录页信息,数据页间通过双向链表关联。
  • 数据页每页16kb
  • 聚簇索引一般是主键、若无主键则使用唯一非空索引、若无唯一非空字段则隐式创建一个递增非空字段

非聚簇索引(二级索引)

为什么是B+Tree 而不是其他数据结构

主要目的是为了降低io次数、

  • Hash:存在Hash冲突、不支持区间查询。
  • 跳表:不适合范围查询
  • 二叉树:每个节点只能有2个子节点,那么随着数据量增大的时候,节点个数越多,树高度也会增高(也就是树的深度越深),增加磁盘I/O次数,影响查询效率。
  • Btree:B树是一棵多叉树,相比较于二叉树将整体的树高度降低了,同时支持按区间查找。但只能高效单查询,并不能高效区间查询
  • B+Tree: b+与b的区别:数据都在叶节点,链成一张表。 b+于b的优势:高效的区间查询,简单的增删。

为什么每一页的数据是16kb更大不是能降低磁盘io吗?

从磁盘的物理结构来看存取信息的最小单位是扇区,一个扇区是512字节。 从操作系统对硬盘的存取管理来看,存取信息的最小单位是簇,簇是一个逻辑概念,一个簇可以是2、4、8、16、32或64个连续的扇区。NTFS文件系统格式化的时候默认是8个扇区组成一个簇,即4096字节。linux的分区常用的也是4K大小。

对于系统来说,一次磁盘读取最小读取4K数据,那么如果程序只需要1.5K,5.5K数据都会是浪费。所以索引的一页一般是4K的倍数,默认是16K。

32k 64k把页的数量调大不是更好?不是的.读的情况下可能会更好,但是数据页也会涉及到写的操作。一页数据里只修改了一条那么也会重新刷盘,如果数据量太大显然不合理。