MENU

MySQL-索引(Index)

July 9, 2019 • Read: 309 • Java

MySQL 学习笔记

索引

高效获取数据的排好序的数据结构

索引数据结构

  • 二叉树 存在问题,插入单边增长的数据会变成链表
  • 红黑树(二叉平衡树) 自旋?自旋条件 ,存在弊端。树的高度不可控,高度多少次查询多少次,io次数变多。
  • hash表

    • 性能高,不能很好的支持范围、排序、模糊查询
  • B-Tree (索引元素不重复)

    • 叶节点具有相同的深度,叶节点的指针为空
    • 节点中的数据索引从左到右递增排列
  • B+Tree(B-Tree变种、多路平衡树)

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

存储引擎

  • MyISAM(非聚集)

    • .frm 文件存储表结构
    • 索引文件和数据文件是分离的
    • .MYI 文件存储索引;.MYD存储数据行
  • InnoDB(聚集)

    • 表数据文件本身就是按B+Tree组织的一个索引结构文件
    • 叶节点包含了完整的数据记录
    • 为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?
    • 为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

联合索引底层存储结构

  • 索引最左前缀原理