数据库索引

索引是帮助MySQL高效获取数据的排好序数据结构

索引可以考虑的数据结构

  • 二叉树:会出现单边增长的问题,如果插入的数据是逐条递增的,按照二叉树小的数据在父节点的左边,大的数据在父节点的右边的规则,那么将要插入的数据会全部放在右边,这时查询起来跟没有建立索引之前并没有什么区别,如下面这张图

  • 红黑树:红黑树存储跟二叉树规则相似,但是红黑树会进行自动调整,不会出现单边增长成一个链表的问题,但是红黑树维护复杂,而且随着数据量的增大,树的高度会急剧增加,也会影响到查询速度
  • Hash表:Hash表很少使用,因为hash索引只能做等值查询,没办法做范围查找跟模糊查询,这是很不符合业务需求的
  • B-Tree

    • 叶节点具有相同的深度

    • 叶节点的指针为空

    • 节点中的数据索引从左到右递增排列

    • B树的结点都是带有数据的,这是和B+树最大的不同

    • B-Tree采用的方法是一次性加载多个值到内存中作为一个节点,在内存中查询一个值的速度是非常快的,远小于一次磁盘i/o操作,但是也不能将所有的数据都一次性加载在内存中,这样在数据量也别大的时候是不现实的,mysql官方对数据做了一个限制,一次加载的数据最好在16k

      但是b树有一个缺点,就是无法做范围查询,所以在mysql中也不是使用b树作为索引的数据结构

  • B+Tree(B-Tree变种)

    • 非叶子节点不存储data,只存储索,可以放更多的索引

      • 非叶子节点上面的数字表示范围,空格处存一个指针,指向存储这个范围的数据页,譬如上面15到20之间的指针指向的就是存储15到20的数据页,假如现在查找索引是30的数据,先来到根节点发现30大于15小于56,那么去15到56的空白处查找,空白处指向最左边的节点,在最左边的节点中查询30在20到49之间,那继续在20到49之间的空格处查找,空格指向的数据页就存储着索引为30的数据

      • 假设mysql使用bigint存储数据,那个一个数占8个字节,innodb引擎中一个指针大小为6个字节,加起来是14b,一个数据页16k,那么一个数据也可以存储1170个这样的数据跟指针,那么三层高度的B+树可以存储大概1170*1170*16个数据(假设一条数据占1k),大概是两千多万行数据

    • 叶子节点不存储指针

    • 顺序访问指针,提高区间访问的性能

    • 在B+树中是可以解决范围查询的,在B树中各个节点之间是没有任何关系的,但是在B+树中,通过上面的图可以看到,是有一个双向指针指向下一个数据的,这样就可以进行范围查找

数据库引擎

数据库引擎使用的比较多的就是innodb跟MYISAM

MYISAM

MyISAM索引文件和数据文件是分离的(非聚集)

它表现为三个文件,即一张表对应三个文件

  • xxx.frm:这个文件是存储表的数据定义的相关信息的

  • xxx.MYD:这个文件是存储表中所有的数据行

  • xxx.MYI:这个文件存储表的索引

INNODB

INNODB引擎的索引文件跟数据文件是聚焦的

INNODB引擎存储表只有两个文件

  • xxx.frm:存储表的数据定义相关的信息

  • xxx.ibd:存储表的数据以及索引数据

    • 该表文件本身就是按照B+Tree组织的一个索引结构文件

    • 该文件中的索引叫做聚集索引,叶节点包涵了完整的记录

    • 这也就是为什么innodb表中必须有主键的原因,没有主键就无法组织文件结构,并且一般推荐使用整型作为自增主键

 

posted @ 2019-10-30 21:41  Jin同学  阅读(123)  评论(0)    收藏  举报