MySQL索引(innodb)

  • 数据结构
    多路搜索平衡树,是平衡树的一种,所有叶子节点都必须在同一层。
    并且叶子节点之间通过双向链表结构连接。(用于优化范围查询)
  • 作用
    加速查询
  • 创建过程
    列值排序 -> 创建树结构
  • 存储规则
    - 所有非叶子节点存储索引值和指向下层节点的指针,索引值与指针间隔穿插存储。
    - 对于聚簇索引(主键索引),叶子节点直接存储行数据;对于二级索引(非主键索引),叶子节点存储索引值和主键值。
  • 查询过程
    从根节点开始,通过二分查找,找到指向下层节点的指针,进入下层节点。
    按照同样的规则,逐层下移,直到叶子节点。
    如果是聚簇索引,可以直接在叶子节点获取行数据,如果是二级索引,先获得主键值,再回表通过主键索引找到行数据。
  • 索引再平衡
    - 介绍
        - 由于索引的数据结构需是有序的严格的平衡树,所以随着数据的更新(增删改),需要不停地对树的节点做分裂或合并,以保证树的平衡性和节点的顺序性。
    
    - 影响
        - 因为innodb存储索引和数据的单位都是""(默认16kb)。
        - 所以在节点分裂和合并过程中,会开新页并迁移数据(页分裂)或合并页并迁移数据(页合并),会导致并不是所有页都能正好存满数据,尤其是聚簇索引的叶子节点还存放了行数据,影响会更大。
        - 随着树的节点变动,存储的碎片化可能会越来越高,即存不满数据的页越来越多。
  • 索引重建
    - 介绍
        - 索引再平衡导致存储碎片化到达一定程度,mysql会自动触发索引重建。
        - 会重新开页并创建新的索引树,并将数据按顺序迁移到新树。
    - 影响
        - 消除碎片化
        - 数据库需要消耗大量性能完成重建工作。并且出于安全考虑,会锁表或者加其他锁保证数据安全,导致数据库出现响应慢或卡死一段时间的情况。

     

posted @ 2025-08-27 21:24  CJTARRR  阅读(7)  评论(0)    收藏  举报