在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录。
创建表时,MySQL会在数据库子目录下创建一个和表同名的frm文件保存表的定义。

因为MySQL使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体的平台密切相关。
不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在MySQL服务层统一处理的。


一、表空间

MySQL5.5 及之后版本默认存储引擎,Innodb使用表空间进行数据存储
Innodb 存储引擎表由表空间文件ibdfrm(表结构)是所有引擎都有的。

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以后默认就是使用的独立表空间


二、系统表空间的表转移到独立表空间中的方法

把原来存在于系统表空间中的表转移到独立表空间中的方法
步骤:

  1. 使用mysqldump导出所有数据库表数据
  2. 停止MySQL服务,修改参数(my.cnf加入innodb_file_per_table),并删除Innodb相关文件
  3. 重启MySQL服务,重建Innodb系统表空间
  4. 重新导入数据

三、Innodb存储引擎的特性

特性1:

  • Innodb 是一种事务性存储引擎
  • 完全支持事务的ACID特性
  • 支持事务所需要的两个特殊日志类型:Redo LogUndo Log

Redo Log:实现事务的持久性(已提交的事务)
Undo Log:未提交的事务,独立于表空间,需要随机访问,可以存储在高性能io设备上。

Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback
Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。

特性2:

  • InnoDB 支持行级锁。
  • 行级锁可以最大程度地支持并发。
  • 行级锁是由存储引擎层实现的。