看图说话
聚集索引特点
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,再回表获取地址。