MySQL索引底层数据结构
MySQL索引主要基于B+树和哈希表实现,其中InnoDB存储引擎默认使用B+树索引结构。B+树是一种多路平衡查找树,具有以下特点:
- 所有叶子节点位于同一层,形成有序链表
- 非叶子节点仅存储键值和指针,不存储数据
- 数据记录只存储在叶子节点中
B+树相比B树的优势:
- 更少的磁盘I/O次数(节点可容纳更多键值)
- 范围查询效率更高(叶子节点链表结构)
- 查询性能更稳定(每次查询都要到叶子节点)
索引算法原理
B+树索引的查找过程遵循典型的多路搜索树算法: 从根节点开始,通过比较键值确定子节点指针,直到定位到目标叶子节点。插入和删除操作通过平衡算法维持树的高度平衡。
页分裂是B+树维护的关键机制: 当叶子节点已满时会发生页分裂,中间键值提升到父节点,原节点分裂为两个新节点。InnoDB采用乐观插入策略,仅在必要时才进行页分裂。
聚集索引与非聚集索引
InnoDB使用聚集索引组织表数据:
- 主键索引的叶子节点包含完整数据记录
- 表数据物理上按主键顺序存储
- 非聚集索引(二级索引)的叶子节点存储主键值
MyISAM使用非聚集索引结构: 所有索引的叶子节点都存储数据记录的物理地址指针,主键索引与其他索引无本质区别。
索引优化要点
选择合适的索引列: 高频查询条件、连接字段、排序字段应优先考虑。避免过度索引,每个额外索引都会增加写入开销。
索引失效的常见场景:
- 对索引列使用函数或运算
- 隐式类型转换
- 前导模糊查询(LIKE '%xxx')
- 不符合最左前缀原则的复合索引使用
索引性能分析工具
EXPLAIN命令可查看查询执行计划: 重点关注type列(从最优到最差:system > const > eq_ref > ref > range > index > ALL)和possible_keys/key列。
性能监控相关系统表:
- information_schema.STATISTICS
- performance_schema.table_io_waits_summary_by_index_usage
- sys.schema_index_statistics
特殊索引类型
自适应哈希索引: InnoDB自动为频繁访问的索引页构建哈希索引,加速等值查询。通过innodb_adaptive_hash_index参数控制。
全文索引: 基于倒排索引实现,支持自然语言搜索。InnoDB从5.6版本开始支持全文索引,通过MATCH...AGAINST语法使用。
空间索引: R-Tree结构,用于地理数据查询。MyISAM和InnoDB都支持空间索引,遵循OpenGIS标准。
4029

被折叠的 条评论
为什么被折叠?



