mysql索引底层相关数据结构

  • 哈希表-不能范围检索

  • 二叉查找树 BST-存在不平衡导致的检索性能降低的问题

  • 红黑树,平衡树但是有“右倾”趋势

  • AVL树:平衡树,数据库查询数据的瓶颈在于磁盘 IO,一次磁盘 IO 只能取出来一个节点上的数据加载到内存里,需要减少磁盘 IO次数

  • b-树(b-树就是b树) 平衡树
    多叉树,一个节点不止一个数据分段向下查询


B 树用作数据库索引有以下优点:
优秀检索速度,时间复杂度:B 树的查找性能等于 O(h*logn),其中 h 为树高,n 为每个节点关键词的个数;
尽可能少的磁盘 IO,加快了检索速度;
可以支持范围查找。

  • b+树


B 树和 B+树有什么不同呢?
第一,B 树一个节点里存的是数据,而 B+树存储的是索引(地址),所以 B 树里一个节点存不了很多个数据,但是 B+树一个节点能存很多索引,B+树叶子节点存所有的数据。
第二,B+树的叶子节点是数据阶段用了一个链表串联起来,便于范围查找。

选择b+树作为支持索引的底层数据结构!


  • 索引
    建表的时候Mysql 就会自动建立好主键 ID 索引树

  • MyISAM 引擎:非聚集索引方式

    Myisam 创建表后生成的文件有
    frm:创建表的语句
    MYD:表里面的数据文件(myisam data)
    MYI:表里面的索引文件(myisam index)

    MyISAM 引擎把数据和索引分开了,一人一个文件,这叫做非聚集索引方式。他通过索引定位数据的地址,然后去数据文件中取数据。当我们为某个字段添加索引时,我们同样会生成对应字段的索引树,该字段的索引树的叶子节点同样是记录了对应数据的物理地址,然后也是拿着这个物理地址去数据文件里定位到具体的数据记录

  • Innodb 引擎:聚集索引方式

    Innodb 创建表后生成的文件有:
    frm:创建表的语句
    idb:表里面的数据+索引文件
    聚集索引是可以直接找到数据。

而Innodb 引擎 B+树的叶子节点存储的是主键 ID 对应的数据,当我们为某个字段添加索引时,我们同样会生成对应字段的索引树,该字段的索引树的叶子节点存储的是主键 KEY!拿到主键 KEY 后,InnoDB 再会去主键索引树里找对应的数据

  • select执行中的索引操作

你可能感兴趣的:(mysql索引底层相关数据结构)