InnoDB存储引擎的优点
InnoDB在设计时考虑到了处理大数据量时的性能,支持事务,回滚和崩溃修复的能力,通过多版本并发控制来减少锁定(降低了锁的争用),同时还支持外键的约束;通过缓冲池在内存中缓存数据来提高查询的性能;可以每个表使用各自的独立表空间存储数据并且文件大小只受限于操作系统.
总结:InnoDB存储引擎存储的数据量大,性能高,可以有效的保证数据安全。
InnoDB的架构
InnoDB主要包括内存结构和磁盘结构。
内存结构
- 缓冲池:内存中的主要工作区域,优化查询的性能。
- 变更缓冲区:优化修改操作的性能。
- 日志缓冲区
- 自适应哈希索引:当某一查询语句的执行次数达到mysql设定的阈值时,mysql会将查询语句和对应的结果集映射起来,从而进一步提升查询的性能。
磁盘结构
系统表空间,独立表空间,通用表空间,临时表空间,撤销表空间,保存的都是真实的数据。
重做日志,双写缓冲区。
为什么要设计成内存结构和磁盘两部分
数据库的作用就是保存数据,用户的真实数据最终都会保存在磁盘当中,但是磁盘的IO速度慢,为了提高访问数据的效率,InnoDB会将查询到的数据缓存到内中,当再次查询时,如果目标数据已经存在于内存中,则直接在内存中读取。
磁盘结构中的文件用来保存数据实现数据持久化;内存结构用来缓存数据提升查询效率。
使用InnoDB存储引擎创建的表对应的数据文件在哪里
当创建一个数据库时,会在数据目录生成一个与数据库同名的子目录。
当创建一个表时,默认会在对应的数据库子目录中生成相应的表空间文件,以表名为文件名,以ibd为文件后缀,用来存储数据和索引。
如果每个表都对应一个表空间文件,则称为独立表空间,在5.7版本之后,默认会为每个表生成独立表空间,可以通过innndb_file_per_table = [on|off] 来进行控制,如果为off,则会将所有的表的数据都存储在系统表空间中。
Mysql的存储结构
Mysql的存储结构是指MySQL为了有效的维护数据而定义的一系列的数据结构。
用户数据在表空间中如何存储?
用户的数据以数据行的方式存储在对应的表空间文件中,为了方便管理,表空间由段,区组,区,页和数据行组成。
若干个数据行组成了页,多个页组成了区,多个区组成了区组,多个区组组成了段,多个段组成表空间。
页是InnoDB磁盘管理的最小单位,内存每次至少读取一个页。
为什么要用页这个数据管理单元?
页是mysql应用层的概念,是mysql根据自身的应用场景而定义的一种数据结构。
页的大小默认为16KB(4个数据块的大小),作为磁盘管理的最小单位。
每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页内部的地址都是连续的。
即使只需要查询一条数据,但是从磁盘上读取了16kb,根据空间局部性原理,也不会造成资源的浪费。
所以,使用页最主要的目的是为了减少磁盘IO,提高性能。
数据页的基本特性
页的默认大小是16KB,可以适用于大多数场景,也可以根据核心表中数据行的大小来调整数据页的大小,调整的大小必须是4kb数据块的整数倍。
每一个页中,即使没有数据也会使用16kb的存储空间,同时与索引的B+树中的节点对应。
MySQL中有多种不同类型的页,但不论哪种类型都会包含页头和页尾,页头和页尾之间的页主体信息根据不同的类型有不同的结构。
查询的数据超过一页的大小,怎么提高查询效率?
拆分成三个问题:
不同的页在磁盘中是不是连续的?
不一定,在不做任何控制的情况下,不同页在磁盘中申请的地址大概率是不同的。
为什么不连续的地址会降低查询的效率?
访问不连续的地址会产生磁盘的随机访问,这是影响效率的主要因素。
扇区是磁盘中存储数据的最小单位,每个扇区大小固定为512B,如果读取某个扇区的数据,分为两步:1.先转动机械臂杆。让磁头找打对应的磁道。2.通过转轴带动盘面的转动找到对应的扇区。
InnoDB如何保证页在磁盘中的连续性?
为了解决磁盘随机访问低效的问题,需要尽可能在磁道上读取连续的数据,来减少磁头的移动,所以MySQL使用区来管理页,每个区(默认是连续的1MB的空间)存放固定数量的页,如果需要跨页读数据,那么大概率就在附近的地址,大幅减少磁头的移动。
综上,跨页查询的三种情况:
- 页在区内是相邻的:磁盘顺序IO,大幅提升效率。
- 页在区内,但不相邻:大幅减少磁头的移动,可以提升效率。
- 页在不同的区:随机IO,不能提升效率。
区和页的关系:区是用来管理页的一种数据结构,其中包含若干个页,从而保证页与页之间的连续性。
当表中的数据很少时如何避免空间的浪费?
通过碎片页和零散区避免空间的浪费。
当创建表时,由于不知道表的数据量级,为了节省空间,最初只会创建7个初始页,而不是一个完整的区。
零散页会放在表空间的碎片区,随着数据量的增加,会申请新的页来存储数据,当碎片去的页超过32个时,才会申请完整的区来存储更多的数据。
如果访问的数据跨区了怎么办?
使用区组结构有效的管理区,每个区组固定管理256个区(256MB),区组条目信息中会记录每个区的偏移量并用双向链表连接。
区组管理区不会像区管理页那样,实现页在物理地址的连续性,一下子申请256MB太大了,所以不同的区在磁盘上大概率是不连续的。
逻辑结构-段
段是一个逻辑概念,作用是管理不同的区和碎片区中的页。
段主要分为叶子节点段和非叶子节点段,对应索引中的叶子,非叶子节点。