赞
踩
InnoDB 是 MySQL数据库系统中最常用的存储引擎之一,尤其在事务处理、并发控制及数据可靠性方面表现突出。以下是对 InnoDB 存储引擎的主要特点和功能的概述:
存储结构:InnoDB 存储引擎将数据按照页(Page)的方式组织在磁盘上,并且采用B+树作为索引结构,使得数据检索效率相对较高。
事务支持:InnoDB 提供完全的 ACID(原子性、一致性、隔离性、持久性)事务支持,适用于需要高可靠性和数据一致性的应用场景,如银行交易、电子商务等。
行级锁定:InnoDB 实现了行级锁定机制,这意味着在执行事务时只锁定受影响的行,而非整个表,这大大提高了并发环境下多用户读写数据的性能。
外键约束:支持外键约束,确保数据的一致性和参照完整性,防止非法的数据操作。
缓冲池:内存管理中,InnoDB 使用了一个称为缓冲池的内存区域,用于缓存表数据和索引,减少磁盘 I/O 操作,提高数据读写的效率。
崩溃恢复:提供完善的崩溃恢复机制,包括 redo 日志(重做日志)和 undo 日志(撤销日志),保证即使在系统崩溃后也能恢复到崩溃前的一致状态。
内存结构:InnoDB 内部有多个内存区域,如redo log buffer、undo logs、buffer pool manager等,用于管理事务、缓存数据以及辅助事务处理过程。
关键特性:
多版本并发控制(MVCC):InnoDB 采用 MVCC 来实现高并发下的读写操作,允许在不阻塞读操作的情况下进行写操作,提升了并发性能,降低了死锁概率。
插入缓冲(Insert Buffer):优化对非唯一二级索引插入操作的性能。
两次写(Double Write):用于保护数据页免受意外宕机造成的数据损坏。
自适应哈希索引(Adaptive Hash Index):自动为经常使用的查询创建哈希索引,提高查询速度。
异步IO(Async I/O):提高磁盘I/O性能,减少等待时间。
MySQL5.7以后,表空间分为:系统表空间、独立表空间、通用表空间、undo表空间、临时表空间。
系统表空间以 ibdata1 命名,新建一个数据库时,InnoDB 存储引擎会初始化一个名为 ibdata1 的表空间文件
默认情况下,这个文件存储所有表的数据,比如看不到的系统表,此外,还会存储数据字典、双写缓冲区、更新缓冲区和undo log。MySQL 5.6 以后,已经可以通过参数来设置 undo log 的存储位置了,可以独立于 ibdata1 文件进行存储。
如果系统表空间大小不够,可以配置为自动扩展,数据库默认的自动扩展大小是 64MB,当然还可以通过添加另一个数据文件来增加系统表空间的大小。
MySQL 默认 ibdata1 大小是 12MB(Mysql 8),一般不建议使用默认大小,在遇到高并发事务时,会受到很大影响,建议把 ibdata1 的初始数值大小调整为 1GB
mysql> show variables like '%innodb_data_file_path%';
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:12M:autoextend |
+-----------------------+------------------------+
1 row in set (0.02 sec)
系统表空间和独立表空间有什么区别?
为什么推荐采用独立表空间?
与系统表空间类似,通用表空间是能够为多个表存储数据的共享表空间。可以根据活跃度来划分表,存放在不同的磁盘上,可以减少 metadata 的存储开销。
undo表空间包含undo log,这是包含有关如何撤消事务对聚集索引记录的最新更改的信息的记录集合。
undo日志默认存储在系统表空间中,但也可以存储在一个或多个undo表空间中。使用undo表空间可以减少任何一个表空间中undo log所需的空间量。undo log 的 I/O 模式也使 undo 空间成为SSD存储的理想选择 。
把临时表的数据从系统表空间中抽离出来,形成独立的表空间参数 innodb_temp_data_file_path ,独立表空间文件名为 ibtmp1,默认大小 12MB
InnoDB 的最小物理存储单位是页,有数据页回滚页等。一般情况下,一个区由 64 个连续的页组成,页默认大小是 16KB,可以自行调整页的大小。区也就是 64*16KB = 1MB
页里又记录着行记录的信息,InnoDB存储引擎是面向列的,也就是数据是按行存储的。行记录格式可以分为四种:Compact,dynamic,redundant,compressed,MySQL5.7 默认使用 dynamic 行记录格式。Compact 是目前使用最多的一种,但默认是 dynamic ,二者有什么不同?
后面再补充
当我们尝试创建一张表之后,InnoDB会自动为我们加上三个字段:
如果是insert语句,那么Undo log日志只需要在回滚的时候需要,当事务提交之后,会被立即删除。
如果是update,delete的时候,产生的undo log日志不仅在回滚的时候需要,在产生快照读的时候也需要,因此其不会被立即删除。(undo log 中残留的旧版本数据可供其他并发事务进行快照读)
首先声明 undo log版本链的数据访问规则:
过程如下:第一个ReadView
思考:应该怎么解决?
解决:设置隔离级别为 RR(可重复读),同一事务从始至终只会生成一个快照
结论:RR(可重复读)可以解决一部分幻读问题
原因:
同一事务的连续多次快照读,ReadView会产生复用,没有幻读问题
特例:当两次快照读之间存在当前读,ReadView会重新生成,导致幻读问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。