MySQL数据库——索引(B+树索引、Hash索引、聚簇索引、非聚簇索引、最左匹配规则)

  • Post author:
  • Post category:mysql




一、MySQL索引


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



1.1 MySQL索引类型


从数据结构上区分为:

  • B+树索引
  • Hash索引
  • B+树与B树


    B树特点:
  • 叶节点具有相同的深度,叶节点的指针为空
  • 所有索引元素不重复
  • 节点中的数据索引从左到右递增排列
  • 非叶节点存储索引和对应的数据内容


    B+树特点:
  • 非叶节点不存储数据内容、只存储索引信息
  • 叶子节点使用指针连接,提高区间访问的性能
  • 在MySQL中一个数据页的大小是默认是16k


    查看mysql文件页大小(16K):

SHOW GLOBAL STATUS like ‘Innodb_page_size’;


B+树提高查询效率,为什么mysql页文件默认16K?


假设我们一行数据大小为1K,那么一页就能存16条数据,也就是一个叶子节点能存16条数据;再看非叶子节点,假设主键ID为bigint类型,那么长度为8B,指针大小在Innodb源码中为6B,一共就是14B,那么一页里就可以存储16K/14=1170个(主键+指针)。那么一颗高度为2的B+树能存储的数据为:1170

16=18720条,一颗高度为3的B+树能存储的数据为:1170

1170*16=21902400(千万级条)。因此当树的每一层不存放数据只存放索引的话可以存储更多的索引,也就是减少了磁盘的IO,提高了查询的效率。因此选择在B树和B+树的选择使用B+树。


Hash索引



优点

  • 对索引的key进行一次hash计算就可以定位出数据存储的位置
  • 很多时候hash索引要比B+树索引更加高校


缺点

  • 仅能满足”==” , “IN” 等单值查询,不支持范围查询(因为散列后无序)

    会导致hash冲突问题



1.2 从索引和数据是否分离的角度

  • 聚集索引(B+树的叶子节点中索引和具体数据在一起,InnoDB实现方式)
  • 非聚集索引(B+树中叶子节点中索引存放数据地址,需要再次IO寻址找到数据,MYISAM实现方式)
  • 主键索引(索引的叶子节点包含整行数据信息)
  • 非主键索引(索引的叶子节点只包含索引列的数据信息,在叶子节点中获取到主键索引的key,然后再从主键索引中找出具体的数据信息)



1.3 几个索引的问题


为什么推荐使用整型的自增主键?


答:因为B+会保证元素的顺序,如果主键非自增,则会在之前已经确定后的树中插入元素,可能会导致树的分裂,增加树的高度,因此,最好顺序向树中插入元素


为什么非主键索引结构叶子节点存储的是主键值?


答:一致性和节省存储空间



1.4 联合索引

多个列共同组成一个多列索引,遵循最左前缀匹配原则(使用索引的话 必须从索引的最左边顺序使用,不能跳过索引列)因为索引是按照每一列进行排序的,先按照第一列排序,之后在第一列排好序的基础上再次对第二列排序。



版权声明:本文为weixin_43556636原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。