0.明确一个知识
mysql的存储引擎是针对表来说的,而不是数据库
1. mysql 的存储引擎
在mysql5.6版本之前,mysql默认使用的MyISM存储引擎,但是5.6版本之后就改用了Innodb作为存在引擎,
2.Innodb的主要优势
2.1 它的DML操作遵循了ACID模型,并具有提交,回滚和崩溃恢复功能的事务,以保护用户数据。
2.2 行级锁定和Oracle风格的一致读取提高多用户并发性和性能
2.3 Innodb table 将数据安排在磁盘上,以基于主键优化查询,每个Innodb表都有一个成为聚集索引的主键索引,该索引对数据进行组织以最大程度的减少主键查找的I/O
2.4 为了维护数据的Integrity, Inodb 支持外键约束,使用外键检查插入,更新和删除操作,以确保它们不会导致不同table之间的不一致。
3. mysql存储引擎的查看
3.1 查看存储引擎设置
show enignes :查看当前数据库支持的所有的存储引擎
select @@default_storage_engine: 查看当前数据库默认的存储引擎
show create table 表名 : 这个可以查看建表时使用的那种存储引擎
3.2 修改存储引擎
alter table 表名 engine=要修改的存储引擎名 :这个命令也会触发整理碎片机制
4.Innodb基础架构
4.1 Buffer Pool(缓冲池)
1. 缓冲池是主存储器中的一个区域,InnoDB
在访问 table 和索引数据时会对其进行缓存。缓冲池允许直接从内存中处理经常使用的数据,从而加快了处理速度。在专用服务器上,通常将多达 80%的物理内存分配给缓冲池。
2.为了提高大容量读取操作的效率,缓冲池被分为多个页面,这些页面可能包含多个行。为了提高缓存管理的效率,缓冲池被实现为页面的链接列表。使用LRU算法的变体将很少使用的数据从缓存中老化掉 。
4,2 缓冲池的LRU算法
此算法是对新加进缓冲池的数据页的一种优化策略,有着"驱逐旧的数据页保留新的数据页",具体见官网文档
4.3 缓冲池的配置
一般来说缓冲池大一点比较好,因为当我们对数据库进行操作时,发生变换的数据页首先会被加载到缓冲池中,如果缓冲池比较大,那么加载的次数就会减少,这样就相应的减少了磁盘I/O次数,从而提供性能。我们一般会通过innodb_buffer_pool_size这个参数选项来配置缓冲池大小。
4.4 change buffer
4.5 log buffer(日志缓冲区)
日志缓冲区是存储区域,用于保存要写入磁盘上的日志文件的数据。日志缓冲区的大小由innodb_log_buffer_size变量定义。默认大小为 16MB,日志缓冲区的内容会定期刷新到磁盘较大的日志缓冲区使大型事务可以运行,而无需在事务提交之前将重做日志数据写入磁盘。因此,如果您有更新,插入或删除许多行的事务,则增加日志缓冲区的大小可以节省磁盘 I/O。
参数:innodb_flush_log_at_trx_commit变量控制如何将日志缓冲区的内容写入磁盘并刷新到磁盘。
innodb_flush_log_at_timeout变量控制日志刷新频率。
5. innoDB磁盘结构
5.1 The system tablespace(共享表空间) 5.6版本之前是默认的表空间
系统表空间是Innodb数据字典,双写缓冲区,更改缓冲区和撤销日志的存储区域,如果在系统表空间中创建表,而不是在独立表空间中创建表,则它也可能包含表的索引和数据
系统 table 空间可以具有一个或多个数据文件。默认情况下,在数据目录中创建一个名为ibdata1
的单个系统 table 空间数据文件
系统 table 空间数据文件的大小和数量由innodb_data_file_path启动选项定义
5.2 File-Per-Table Tablespaces(独立表空间) 5.6版本和之后就默认的是独立表空间
独立的表空间其实就是每一个表都是单独的一个文件,它里面包含数据和索引
5.3 共享表空间和独立表空间对比?
5.3.1 共享表空间
1、数据字典(data dictionary):记录数据库相关信息
2、doublewrite write buffer:解决部分写失败(页断裂)
3、insert buffer:内存insert buffer数据,周期写入共享表空间,防止意外宕机
4、回滚段(rollback segments)
5、undo空间:undo页
===============================================================
关于ibdata1的增长考虑
影响共享表空间增长的对象:insert buffer、undo空间
1、什么时候undo暴涨:
1、大事务为主,例如修改了40万行才提交
2、长事务导致的undo持续增加
2、insert buffer空间很大
1、索引建立过多
2、很多索引不怎么使用
3、索引和主键顺序严重不一致:主键的建立选择有问题
ibdata1使用时要注意:在初始化ibdata1时,最好是设置大一些,避免由于高并发突然暴增,影响性能
一定要在初始化之前就要开始设置 否则初始化之后就不行了
参数 innodb_data_file_path=ibdata1:10G:ibdata2:10G:autoextend
2、undo分离
undo最容易导致ibdata1暴涨,所以需要将undo分离出去,只能在初始化的时候做,初始化之后就没有办法实现undo分离。
处理:
在初始化实例之前,只需要设置 innodb_undo_tablespaces 参数,默认是等于0即指单独存放的undo表空间个数为0,也就是undo为分离;建议将该参数设置大于等于3,即可将undo log设置到单独的undo表空间中。
===============================================================
5.3.2 独立表空间
1、优点:
1、每个表都有自已独立的表空间。
2、每个表的数据和索引都会存在自已的表空间中。
3、可以实现单表在不同的数据库中移动。
4、空间可以回收
5、对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
2.缺点:单表增加比共享空间方式更大
3、共享表空间在Insert操作上少有优势,其它都没独立表空间表现好。当启用独立表空间时,合理调整:innodb_open_files(指定InnoDB一次可以保持打开的.ibd文件的最大数目)。
6.Doublewrite 缓冲区
doublewrite 缓冲区是一个存储区域,其中InnoDB
在将页面写入InnoDB
数据文件中的适当位置之前,先写入从缓冲池刷新的页面。如果在页面写入过程中发生 os,存储子系统或mysqld进程崩溃,则InnoDB
可以在崩溃恢复期间从 doublewrite 缓冲区中找到该页面的良好副本。