首先需要了解一下innodb索引结构,关键下面几点:
1,索引结构是B+tree;
2,主键索引的索引结构和数据一起,即数据放到主键索引B+tree的叶子节点中;
3,辅助索引的索引结构也是B+tree,但叶子节点存储关键字和对应的主键,不直接存储数据;
基于前面三点,下面我们重点分析一下DML操作对innodb 索引的影响:
1,innser操作
在主键索引clusterd b+tree上插入数据;
在每个辅助索引secondery b+tree上插入主键;
2,delete操作
在主键索引clusterd b+tree上删除数据;
在每个辅助索引secondery b+tree上删除主键;
3,主键update操作
在主键索引clusterd b+tree上删除原有的数据;
在主键索引clusterd b+tree上插入新的数据;
在每个辅助索引secondery b+tree上删除之前的主键;
在每个辅助索引secondery b+tree上插入新的主键;
4,辅助索引update操作
在主键索引clusterd b+tree上更新数据;(只需更新对应的叶子的数据部分,主键索引结构记录无需变更)
在每个辅助索引secondery b+tree上删除原先的记录;(辅助索引发生变化,原先的记录要先删除,重新插入到B+树中)
在每个辅助索引secondery b+tree上插入原先的记录;(主键不变化,即辅助索引结构记录的叶子数据不变)
1,索引结构是B+tree;
2,主键索引的索引结构和数据一起,即数据放到主键索引B+tree的叶子节点中;
3,辅助索引的索引结构也是B+tree,但叶子节点存储关键字和对应的主键,不直接存储数据;
基于前面三点,下面我们重点分析一下DML操作对innodb 索引的影响:
1,innser操作
在主键索引clusterd b+tree上插入数据;
在每个辅助索引secondery b+tree上插入主键;
2,delete操作
在主键索引clusterd b+tree上删除数据;
在每个辅助索引secondery b+tree上删除主键;
3,主键update操作
在主键索引clusterd b+tree上删除原有的数据;
在主键索引clusterd b+tree上插入新的数据;
在每个辅助索引secondery b+tree上删除之前的主键;
在每个辅助索引secondery b+tree上插入新的主键;
4,辅助索引update操作
在主键索引clusterd b+tree上更新数据;(只需更新对应的叶子的数据部分,主键索引结构记录无需变更)
在每个辅助索引secondery b+tree上删除原先的记录;(辅助索引发生变化,原先的记录要先删除,重新插入到B+树中)
在每个辅助索引secondery b+tree上插入原先的记录;(主键不变化,即辅助索引结构记录的叶子数据不变)