四、MySQL存储引擎之InnoDB
在文件系统中,MySQL
将每个数据库(也可以称之为schema
)保存为数据目录下的一个子目录。
创建表时,MySQL
会在数据库子目录下创建一个和表同名的frm
文件保存表的定义。
因为MySQL
使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体的平台密切相关。
不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在MySQL
服务层统一处理的。
一、表空间
MySQL5.5
及之后版本默认存储引擎,Innodb
使用表空间进行数据存储Innodb
存储引擎表由表空间文件ibd
,frm
(表结构)是所有引擎都有的。
Innodb
有自己表空间
的概念,数据存储在表空间之中,具体存储在什么样的表空间,
查看参数值
$ show variables like 'innodb_file_per_table';
设置为off值
set global innodb_file_per_table=off
ON
:独立表空间(推荐),为每个表建立一个扩展为ibd
的文件(tablename.ibd
)OFF
:系统表空间(ibdataX
)
系统表空间和独立表空间要如何选择
比较:
- 系统表空间无法简单的收缩文件大小
- 独立表空间可以通过
optimize table
命令收缩系统文件 - 系统表空间会产生
IO
瓶颈 - 独立表空间可以同时向多个文件刷新数据
强烈建立对Innodb
使用独立表空间,优化什么的更方便,可控!且Mysql5.6
以后默认就是使用的独立表空间
二、系统表空间的表转移到独立表空间中的方法
把原来存在于系统表空间中的表转移到独立表空间中的方法
步骤:
- 使用
mysqldump
导出所有数据库表数据 - 停止
MySQL
服务,修改参数(my.cnf
加入innodb_file_per_table
),并删除Innodb
相关文件 - 重启
MySQL
服务,重建Innodb
系统表空间 - 重新导入数据
三、Innodb存储引擎的特性
特性1:
Innodb
是一种事务性存储引擎- 完全支持事务的
ACID
特性 - 支持事务所需要的两个特殊日志类型:
Redo Log
和Undo Log
Redo Log
:实现事务的持久性(已提交的事务)Undo Log
:未提交的事务,独立于表空间,需要随机访问,可以存储在高性能io
设备上。
Undo
日志记录某数据被修改前的值,可以用来在事务失败时进行rollback
;Redo
日志记录某数据块被修改后的值,可以用来恢复未写入data file
的已成功事务更新的数据。
特性2:
InnoDB
支持行级锁。- 行级锁可以最大程度地支持并发。
- 行级锁是由存储引擎层实现的。