MySQL索引原理

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

  • 二叉树

    image.png

  • 红黑树

  • hash表:通过计算hash值来存放数据,查找效率高,但是不适合范围查找

  • B-Tree
    叶子节点具有相同的深度
    叶子节点的指针为空
    叶子节点的数据索引从左到右递增排序

    image.png

  • B+Tree(B-Tree变种)
    MySQL默认索引
    非叶子节点不存储data,只存储索引,这样就可以存放更多的索引
    叶子节点不存储指针
    顺序访问指针,提高区间访问的性能

    image.png

    MyISAM索引文件和数据文件是分离的(非聚集)
    MySQL的数据都存储在MySQL安装目录的data文件夹下,库名下面是表名,不同的后缀表示不同的文件。其中,对于MyISAMM,后缀为frm的是表结构信息,MYD是表中的数据,MYI是表对应的索引MySQL的数据都存储在MySQL安装目录的data文件夹下,库名下面是表名,不同的后缀表示不同的文件。其中,对于MyISAMM,后缀为frm的是表结构信息,MYD是表中的数据,MYI是表对应的索引
    image.png

InnoDB索引实现(聚集)

image.png

  • 表数据文件本身即是按B+Tree组织的一个索引结构文件

  • 聚集索引的叶子节点包含了完整的数据记录

  • 为什么InnoDB必须有主键,并且推荐使用自增主键?
    因为: 主键用来做索引,整型是因为比较速度快(如果是字符串还得逐个比较,查ASCII码表);占用空间小,能存更多的索引(给每一个节点分配的内存大小是固定的);会导致树分裂,会破坏之前已经存储好的数据结构,效率很低

  • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

  • 对于InnoDB,后缀为frm的是表结构信息,ibd文件是表中的数据和表对应的索引
    聚集索引:把数据和索引存储在同一个文件里面
    非聚集索引:把数据和索引存储在不同的文件里面

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容