MySQL默认引擎Innodb
Innodb使用表空间进行数据存储
控制参数:innidb_file_per_table
ON:独立表空间:tablename.ibd
OFF:系统表空间:ibdtaX(X代表数字)
show variables like 'innodb_file_per_table';
//默认innodb_file_per_table 是on
mysql服务器数据存储文件目录:/usr/local/mysql/var
innodb的存储文件
.frm文件 记录表结构,.ibd存储innodb数据。
//将innodb_file_per_table设置为off #set global innodb_file_per_table=off;
则只有该表的.frm文件,没有 .ibd文件。
系统表空间和独立表空间如何选择:
收缩性
系统表空间无法简单的收缩文件大小
当innodb_file_per_table值为off,innodb的表会存在系统表空间当中。在繁忙的业务当中,系统表空间会不断的增长,只要不超过我们磁盘的限制都可以,但一旦磁盘空间不足,我们不得不删除系统当中无效的数据,比如不会被长期使用的日志类数据,我们删除数据后系统表空间并不会缩小,另外我们想通过复制文件的方式给数据备份,虽然删除了文件数据,但表空间的大小并不会改变。解决办法,把所有innodb中的表导出后,删除innodb相关的表文件后,在重启mysql,在导入数据。使用系统表空间,无法很容易的收缩系统文件,造成大量的磁盘碎片,降低系统性能。
独立表空间可以通过optimize table 命令收缩系统文件
当对某一个大表清理时,可只对这个表进行optimize table重建,不需要重启数据库,同时也不会影响这个表的访问。
IO
系统表空间会产生IO瓶颈
由于只有一个文件,那么对多个表进行同时数据刷新时,在文件系统实现时是顺序进行的。会产生一定的IO瓶颈。
独立表空间可以同时向多个文件刷新数据
对于独立表空间,每一个表都有自己的独立文件,则数据刷新时,可以多个文件写入。
表转移步骤
把系统表空间的表转移到独立表空间
1、使用mysqldump导出所有数据,
2、停止mysql服务器,修改参数,并删除Innodb相关文件
3、重启MySQL服务,重建Innodb系统表空间
4、重新导入数据
Innodb 存储引擎的特性
1、事务性存储引擎
完全支持事务的ACID特性(原子性、一致性、隔离性、持久性)
Redo Log(重做日志) 和 Undo Log(回滚日志)
Redo Log实现持久性,有两部分一个是内存中的重做日志缓冲区 ,由innodb_log_buffer_size 决定大小,另一个是重做日志文件innodb_log_files_in_group文件。
2、行级锁
作用管理共享资源的并发访问
锁实现事务的隔离性
锁的类型(共享锁(读锁)、独占锁(写锁))
锁的粒度(表级锁、行级锁)
表级锁语句: lock table 表名 write;解锁语句:unlock table;
阻塞和死锁
阻塞:不同锁之间兼容性间的关系,在一些事务中的锁需要等待了一个事务中的锁释放资源,形成阻塞。
死锁:两个或两个以上的事务在执行过程中相互占用了对方等待的资源而产生的异常。可以由系统自动处理,系统选择资源占有最小的事务回滚,其他事务可继续。
3、Innodb状态检查
show engine innodb status
使用场景:
v5.6前 除空间应用和全文索引应用都可以Innodb,该两者只有MyIsam支持。
v5.7以后Innodb可支持空间应用和全文索引应用