Mysql--InnoDB引擎要点总结

关于Mysql数据库的InnoDb引擎,每一个后端程序员都应该有所了解。这篇文章基于《MySql技术内幕–InnoDB存储引擎》,进行了总结和提炼,以便于快速掌握其核心要点。

在这里插入图片描述

一、特点

1.第一个完整支持ACID事务的MySQL存储引擎,BDB是第一个支持事务的MySQL存储引擎,现已停止开发

2.高可用、高性能、高扩展

二、版本

老版本InnoDB:支持ACID、行锁设计、MVCC

InnoDB 1.0.x:增加了compress和Dynamic页格式

InnoDB 1.1.x:增加了Linux AIO、多回滚段

InnoDB 1.2.x:增加了全文索引支持、在线索引添加

三、索引

  1. 聚集索引的叶子节点中保存的是行数据,而不是指向目标数据的指针

  2. 聚集索引的叶子节点在物理上并不是连续的,但是通过双链表链接,在逻辑上是连续的

  3. 辅助索引的叶子节点保存的是辅助索引键与该条记录的主索引键,通过辅助索引查找记录时,先找辅助索引B+树,然后再根据获得的主索引键值,去找主索引B+树,最后获得整个行数据

  4. B+树的分裂分两种情况:随机插入与同向插入。在随机插入上,B+树的分裂和正规的B+树没有区别。但是当B+树朝一个方向(自增\自减)插入时,常常会出现空间浪费的现象。因此InnoDB做了一点优化,在面临分裂时,将插入点移入新的叶子节点,其前面的所有节点保持不动

  5. B+树的索引创建和删除代价大,优化方案:Fast Index CreationOnline DDLOnline DML

  6. Cardinality值,可以通过show index from (table)命令查看一张表的Cardinality值。 这个属性是对本索引依赖的键值的不同个数估计,抽出8个索引B+树的叶子节点进行抽样估计,将其中不同键值个数统计出来,相加,除以8,并乘以叶子节点总数得到。 一般来说,若一个索引上的Cardinality比较小,这意味着索引查找效率将会很低(重复率太高),不建议使用索引,反之亦然。

  7. 覆盖索引与回表。如上所述,InnoDB的辅助索引通常需要查询两次B+索引树来找到目标行,即查完一次辅助索引B+树,找到主键后,在查询主索引B+树,这就是回表操作。回表操作增加了系统IO,如果能减少回表操作,那么查询效率就会提高,于是覆盖索引出现了。

    ​ 覆盖索引是指,如果在一次辅助索引的查询过程中,可以直接获得返回列的值,那么就不再查询主索引B+树。

    ​ 例如在表student(id,name,sex)上,id为primary key,name为key,即id上建立了聚簇索引,在name上建立了辅助索引

    ​ 对于查询select id,name from student where name = 'Bryant',辅助索引的叶子节点上可以直接返回id,name列的值,可以采用覆盖索引,不再回表

    ​ 对于select id,name,sex from student where name = 'Bryant',辅助索引的叶子节点上没有存储sex的值,必须回表查询。优化方案:建立联合索引(name,sex)

  8. 覆盖索引的应用:

    1. 辅助索引列上的全表count查询优化
    2. 列查询回表优化(如7所述)
    3. 分页查询
  9. 不走索引的特殊情况:如果在辅助索引列上进行范围查询,且无法使用覆盖索引,则查询效率会非常低:先通过辅助索引找到匹配要求范围的行的主键,然后再找主索引B+树,此时又成了离散查询。因此,即时在where的判断属性上存在辅助索引,优化器也会选择不走该辅助索引,而以主索引查询代替

猜你喜欢

转载自blog.csdn.net/weixin_44580146/article/details/109097153
今日推荐