闲聊MySQL:(二)存储引擎之InnoDB浅析

前言

上一篇中,对MySQL中支持的引擎列表进行了简要介绍,本篇,我们来浅析一下MySQL中最为常用,也是最为重要的引擎——InnoDB。

本篇主要基于MySQL官方文档,InnoDB引擎篇,官方文档地址:https://dev.mysql.com/doc/refman/5.5/en/innodb-introduction.html

MySQL架构

在介绍InnoDB引擎之前,我们先来了解一下MySQL的架构:

MySQL引擎

最上层用于连接、线程处理的部分并不是 MySQL 『发明』的,很多服务都有类似的组成部分;第二层中包含了大多数 MySQL 的核心服务,包括了对 SQL 的解析、分析、优化和缓存等功能,存储过程、触发器和视图都是在这里实现的;而第三层就是 MySQL 中真正负责数据的存储和提取的存储引擎。

InnoDB介绍

InnoDB是一个兼顾高性能与高可用型的数据引擎,从MySQL5.5.5版本后,取代了MyISAM,成为了MySQL的默认引擎。除非你手动去修改默认引擎配置项,否则,在创建表的时候,引擎的默认选项即为InnoDB。

InnoDB引擎的核心优势

1、DML操作遵守ACID模型,支持事务提交,回滚,异常恢复能力。

2、支持行级锁,和Oracle风格的多用户并发访问下的一致性读,行锁大幅度提高了多用户并发操作的新能。

3、InnoDB数据表将数据存储在硬盘,通过主键优化查询。每一个InnoDB的数据表都有一个主键索引,名为聚簇索引,通过主键索引进行数据查询可以最小化的I/O操作。

如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

4、对于保持数据的完整性,InnoDB支持外键关联。使用外键进行新增、更新、删除操作时,可以保证跨表的数据一致性。

InnoDB数据表的优势

1、 如果出现服务器由于硬件或软件问题宕机,无论此时数据库发生了什么,在重启数据库后,用户不必做任何事情,InnoDB的异常恢复机制会自动记录在崩溃前的提交记录,并撤销正在进行中并未提交的改变。只需要进行重启操作,剩下的交给MySQL即可。

2、 InnoDB引擎维护了自己的缓冲区池,在主内存中缓存了表与索引数据。经常从内存中直接读取数据。缓存可以用于存储多种类型的信息以及加快处理速度。在专有的数据库服务器上,经常80%的物理内存都被分配给缓冲区池。

3、 如果你将关联数据分割到不同的表中,你可以使用外键进行完整性约束。更新或删除数据时,在其他表中相关联的数据也会一并自动的更新或删除。如果尝试插入数据到第二张表中去,而并操作对应主表,这种脏数据会自动被清除掉。

4、 如果数据在硬盘或内存中损坏,检查机制会在你使用该数据之前,提示你是虚假的数据。

5、 当你通过合适的主键列去设计数据库中的每一张表时,涉及到的列会自动进行优化。访问速度会非常的快,当主键列出现在where、order by、group by条件中,以及join操作。

6、 插入、更新、删除操作会被“修改缓冲区”的自动机制进行优化,InnoDB不仅允许并发读取和写入访问相同的数据表,而且它缓存变更的数据使得硬盘I/O更加高效。

7、 性能优势不仅限于大数据表的长时间执行查询。在表中当相同的数据行被查询过后,“自适应Hash索引”的特性,可以使得再次查询变得更快,像是来自于一张hash表。

8、 你可以自由的混合InnoDB表和其他引擎的表在同一个查询中。例如,你可以使用join操作合并数据从InnoDB表与memory表在一个单次查询中。

9、 InnoDB引擎的设计可以保证CPU最高效使用率和最强性能对于处理大数据量操作。

10、InnoDB可以处理大规模数据量,甚至可以处理2GB之内的系统文件。

InnoDB的事务与隔离级别

AICD事务支持

InnoDB支持事务操作,其采用了AICD模型。以此来保证数据的完整性,以及在异常情况下结果的正确性,例如软件崩溃和硬件故障。

下面分别介绍一下,InnoDB对ACID 四大特性的支持:

  • 原子性(Atomicity)

    • 支持自动提交
    • 支持COMMIT操作
    • 支持ROLLBACK操作
  • 一致性(Consistency)

    • 支持双写缓冲区
    • 支持异常状况恢复
  • 隔离性(Isolation)

    • 支持自动提交
    • 支持设置隔离级别
  • 持久性(Durability)

    • 支持双写缓冲区,通过 innodb_doublewrite 配置开启
    • 支持提交日志落盘,通过 innodb_flush_log_at_trx_commit 配置开启
    • 支持binlog日志

隔离级别

事务的隔离性是数据库处理数据的几大基础之一,而隔离级别其实就是提供给用户用于在性能和可靠性做出选择和权衡的配置项。

InnoDB支持四种隔离级别:

  • READ UNCOMMITED(未提交读):使用查询语句不会加锁,允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

  • READ COMMITED(提交读):只能读取到已经提交的数据,只对记录加记录锁,而不会在记录之间加间隙锁,所以允许新的记录插入到被锁定记录的附近,所以再多次使用查询语句时,可能得到不同的结果(Non-Repeatable Read)

  • REPEATABLE READ(可重复读):多次读取同一范围的数据会返回第一次查询的快照,会返回相同的数据行

  • SERIALIZABLE(串行读):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

下面对上面四种隔离级别进行简单的举例说明:

1、未提交读:也可以叫做脏读,就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

2、提交读:也可以叫做不可重复读,是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

3、可重复读:多次读取同一范围的数据会返回第一次查询的快照,会返回相同的数据行,InnoDB实现RR的可重复读使用MVCC机制,核心依赖于Undo LogReadView

4、串行读:这个比较好理解,即独占锁,读写都会阻塞,会大大降低并发量。

MySQL 中默认的事务隔离级别就是可重复读(REPEATABLE READ),不保证不会出现幻读的情况,但是可以使用Next-Key锁 机制解决。

结语

本篇,我们对InnoDB进行了简要的介绍,了解了其主要的特性,对于其存储结构、锁机制没有进行介绍,下一篇中,我们将继续聊InnoDB引擎,对其实现机制进行更详细的分析,敬请期待!

本文参考:

MySQL官方文档InnoDB篇:https://dev.mysql.com/doc/refman/5.5/en/innodb-introduction.html

浅入浅出MySQL和InnoDB:https://draveness.me/mysql-innodb

MySQL 四种事务隔离级的说明:https://www.cnblogs.com/zhoujinyi/p/3437475.html

更多精彩文章, 请关注我的个人公众号:老宣与你聊Java
让我们一起共同学习成长!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值