MySQL InnoDB 索引结构浅析

看图说话

聚集&非聚集索引

聚集索引特点

B+树结构;

叶子节点存行记录数据,叶子节点初始化一页(磁盘管理单位),当一页达到装载因子(15/16)会自动开辟新的页;

行数据存储按ID顺序存储;

非聚集索引特点

叶子节点存索引数据和索引对应的主键ID,比如图中“年龄&姓名”组合索引;

获取数据需要再次通过主键ID走一次聚集索引;

B+树索引

矮胖平衡树;

非叶子只存索引;

叶子节点是链表结构,具有顺序性;

优点:层级低减少IO次数,非叶子节点全部存储索引地址,一次IO获取一个Page,可最大获取索引范围,如果非叶子节点存数据,可能需要多次IO才能取完索引范围。

为什么主键要最好自增

叶子节点存数据,且是按ID顺序排序

如果不是顺序的,就会发生插入行为,这样就会发生数据迁移情况,造成多次IO发生

分布式ID生成器也是不能保障顺序性,如snowflake,高位取时间戳,整体是趋势增长,发生插入情况概率低,高并发情况下发生插入情况概率高些。

最左匹配原则

如图中年龄&姓名索引,B+树结构根据最左字段年龄构建。

叶子节点存储年龄,姓名,主键ID,按年龄&姓名顺序排序。

查询条件必须带有最左字段才能生效

回表和索引覆盖

索引覆盖:查询语句select字段,索引中有,就不需要再通过主键ID走聚集索引获取,反之就是需要回表,需要通过主键ID走聚集索引获取。

栗子:select 年龄,姓名,ID  where 年龄=2,这个SQL 索引就可以覆盖;

select 年龄,地址 where 年龄=2,这个SQL就需要先通过索引找到,主键索引值ID,再回表获取地址。

你可能感兴趣的:(MySQL InnoDB 索引结构浅析)