MySQL的存储引擎主要包含:
MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等等。其中InnoDB和BDB是支持事务安全表,其他都是非事务安全表。各种引擎特点对比:
以上几个规则引擎中,其中MyISAM和InnoDB最常用,所以以下就对这两个规则引擎进行介绍。
MyISAM:
特点:
- 不支持事务
- 不支持外键
- 访问速度快
- 支持表级锁
MyISAM适合只有insert 和 select的场景。每个MyISAM在磁盘上存储成三个文件,文件名和数据表名相同,但扩展名不同:
- .frm(存储表定义)
- .MYD(存储数据)
- .MYI(存储索引) 数据文件和索引文件如果放在不同的目录则可以平均IO,更有利于操作速度。在创建数据表的时候可以通过DATA DIRECTORY 和 INDEX DIRECTORY 语句指定数据文件的位置和索引文件的位置,需要注意的是指定的路径需要是绝对路径且需要有访问的权限。
MyISAM还支持三种不同的存储格式:
- 静态表(固定长度): 默认的存储格式,字段都是非变长字段,优点:存储迅速、容易缓存、容易恢复 缺点:占用的空间较多,存储的时候会安装列的宽度定义补足空格,但是查询的时候会去掉这部分空格;所以如果我们本身就想在已有的字段内容前后加空格的话,查询的时候也会被去掉。这一点必须要注意。
- 动态表:变长字段, 优点:占用的空间少 缺点:频繁更新、删除会产生空间碎片,需要执行OPTIMIZE TABLE或myisamchk-r命令来改善性能。
- 压缩表:占用的磁盘空间非常小,但是恢复很困难
InnoDB:
特点
- 支持事务
- 自动增长列,自增长列必须是索引,如果是组合索引也必须是第一列,这个一点和MyISAM不同
- 支持外键约束
- 支持行级锁 适合需要事务支持的场景。操作效率相对于MyISAM相对低一些。
InnoDB支持两种存储方式:
- 使用共享表空间存储,这种方式创建表的结构报错在.frm文件中,数据和索引分别报错在innodb_data_home_dir和innodb_data_file_path指定的对应地址。
- 使用多表空间存储,这种方式创建的表的结构也是存储在.frm文件中,但是每个表的索引和数据单独存储在.ibd中,如果是分区表则,每个分区单独对应一个.ibd文件,文件名是 “表名+分区名”,也可以在创建表的时候指定分区的数据文件的位置,这样可以将表的IO均分到各个磁盘部分。要使用多表空间必须注意的是需要配置innodb_file_par_table,且重启才生效。
还有一点需要注意:即使使用了多表空间存储,但是共享表空间仍然是需要的,innoDB把内部数据词典和在线重做日志存储在共享空间中。
如何查看数据库的存储文件
存储文件一般存放在/var/lib/mysql/目录下,以数据库名划分子目录,如: