MySQL数据库索引数据结构

索引的本质

  • 索引是帮助mysql高效获取数据的排好序的数据结构
  • 索引存储在文件里
  • 索引结构
    • 二叉树(红黑树:二叉平衡树)
    • hash
    • BTREE

B-Tree与B+Tree

  • B+Tree是B-Tree的变种
  • B-Tree
    • 度-节点的数据存储个数
    • 叶节点具有相同的深度
    • 叶节点的指针为空
    • 节点中的数据key从左到由递增排列
    • 叶子节点存储data
  • B+Tree
    • 非叶子节点不存储data,只有存储key,可以增大度
    • 叶子节点不存储指针
    • 顺序访问指针,提高区间访问的性能

InnoDB存储引擎

  • InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键
  • 锁的颗粒度:行锁
  • 支持索引

MyISAM存储引擎

  • 不支持事务操作
  • 不支持外键
  • 支持索引
  • 锁的颗粒度:表锁(限制了读/写工作负载的性能)
  • 因此它通常用于 Web 和数据仓库配置中的只读或以读取为主的工作负载

MyISAM 索引实现

  • MyISAM索引文件和数据文件是分离的
  • 先在B+Tree索引文件中查找数据指针,再根据数据指针到数据文件中查找数据

InnoDB 索引实现

  • InnoDB索引和数据是存储在一起的
  • 表数据文件本身就是按B+Tree组织的一个索引结构文件

为什么不用二叉树

  • 索引结构如果使用二叉树,二叉树存储数据深度会越来越深,最终还是会遇到性能瓶颈
// 不是平衡二叉树
// 1
//  \
//   2
//    \
//     3
//      \
//       4
//        \
//         5


// 不是完全二叉树,但是平衡二叉树
//             1
//         /      \
//        2        3
//       /\         \
//      4  5         6
//        /
//       7
posted @ 2025-04-09 00:14  程序员の奇妙冒险  阅读(54)  评论(0)    收藏  举报