Mysql索引数据结构

索引

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

索引数据结构

  • 叉树
  • 红黑树
  • Hash表
  • B-Tree
  • Hsah

B-Tree

  • 叶节点具有相同的深度,叶节点的指针为空
  • 所有索引元素不重复
  • 节点中的数据索引从左到右递增排列

B+Tree(B-Tree 变种 )

  • 非叶子节点不存储 data ,只存储索引 ( 冗余 ) ,可以放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针连接,提高区间访问的性能

注:B+树数据全部放在叶子节点上,致使相同数据量想B+树比B树高度低;

       B+树叶子节点用指针连接,使得B+树范围查找更方便。

Hash

  • 对索引的 key 进行一次 hash 计算就可以定位出数据存储的位置
  • 很多时候 Hash 索引要比 B+ 树索引更高效
  • 仅能满足 “ =” ,“ IN” ,不支持范围查询
  •  hash 冲突问题

InnoDB 索引实现 ( 聚集 )

  • 表数据文件本身就是按 B+Tree 组织的一个索引结构文件
  • 聚集索引 - 叶节点包含了完整的数据记录


• 为什么建议 InnoDB 表必须建主键,并且推荐使用整型的自增主键?

        若不建主键的话,它会这么来做,它会从你这张表里面从第一列开始去选择一列所有元素都不相等的的列,建立索引。若无上述列,则它会帮你建一个隐藏列OK,类似于row id一样,来建立索引。数据库的资源宝贵,我们应避免数据库来做此类事件。

        索引有个重要特性,就是排好序。数据在插入的时候是无序的,但维护到B+树里面去,它会帮你排好序。若主键不使用自增可能会导致一个已经放满的结点,原来的一个大结点分裂成了两个小结点,然后可能树还做了一点点平衡。

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

        一致性和节省存储空间 

聚集索引(聚簇索引)

定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

将表数据存储与索引放到了一块,找到索引也就找到了数据。
非聚簇索引

定义:非聚簇索引,叶级页指向表中的记录,记录的物理顺序与逻辑顺序没有必然的联系。非聚簇索引则更像书的标准索引表,索引表中的顺序通常与实际的页码顺序是不一致的。

将数据存储于索引分开结构,innodb中索引结构的叶子节点存放主键值。

回表

指的是在InnoDB存储引擎下,二级索引查询到的索引列,如果需要查找所有列的数据,则需要到主键索引里面去取出数据。这个过程就称为回表。

联合索引

按照你这索引键的先后顺序,将数据维护到B+树中。

例:比方说我先建name。再建age,再建position。它会先比较name(若name值不同,则以那name排序;若值相同,则以age比较排序),再比较age(同上),再比较position,来决定B+树。

因此我们引出了最左前缀原则,即最左优先,以最左边的为起点任何连续的索引都能匹配上。

因为若越过最左列开始匹配,就会发现数据开始无序。以上图为例:若条件age>30,发现叶节点(Bill、31、dev)满足条件,于是向右查找,发现叶节点(HanMeimei,28,dev)小于30,故索引失效(B+树叶节点从左至右升序排列)。

  • 18
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值