MySQL存储引擎概述:插入式存储引擎是MySQL数据库最重要的特征之一,用户可以根据应用需要选择如何存储和索引数据、是否使用事务等。目的是为了适应不同领域数据库应用要求。
- 使用不同存储引擎提高应用的的效率
- 用户自我定制和使用自己的存储引擎。(灵活)
这里面介绍四种常用的存储引擎:MyISAM、InnoDB、MEMORY、MERGE.
MyISAM
MySQL默认的存储引擎。
特点:
- 不支持事务、外键
- 访问速度快、对事务完整性没有要求,
- 或者以SELECT、INSERT为主的应用基本上可以使用这个引擎来创建表。
存储位置和存储格式
每个MyISAM在磁盘上存储成3个文件,文件名都和表名一致,扩展名有区别:(其实就是划分数据文件和索引文件,平均分布IO,获取更快的速度)
- .frm(存储表的定义)
- .MYD(MyData,存储数据)
- .MYI(MyIndex,存储索引)
存储格式:
- 静态(固定长度)表
- 动态表
- 压缩表
该如何选择哪种存储格式呢?(每种的存储格式有什么好处?)下面就是分析:
静态表:默认存储结构。非变长字段。优点:存储非常迅速、容易缓存、出现故障容易修复
缺点:占用的空间比动态表多
注意问题:静态表存储时,补足空格,访问时不会得到空格。小心丢失尾部空格。
动态表:包含变长字段,记录不是固定长度的。
优点:占用空间相对较小
缺点:容易产生碎片,要定时执行OPTIMIZE TABLE语句或者myisamchk-r命令改善性能
压缩表:myisampack工具创建,占用非常小的磁盘空间。每个记录单独压缩,只有非常小的访问开支
Innodb
Innodb存储引擎提供了具有提交、回滚和崩溃回复能力的事务安全。对比MyISAM,Innodb写的处理效率差一些,并且会占更多的磁盘空间以保留数据和索引。
存储引擎为Innodb的表特点:
1.自动增长列
- Innodb表的自动增长列可以手工插入,但是插入的值如果是0或null,实际插入的将是自动增长后的值。
- 强制设置自动增长列的初始值,默认为1,默认值保存在内存中。该值使用之前数据库重新启动,会在内存中丢失,需要在数据库启动后重新设置。
- 自动增长列必须是索引。
2.外键约束
MySQL支持外键的存储引擎只有Innodb,在创建外键的时候,要求父表必须对应的索引,子表在创建外键的时候也会自动创建对应的索引。
父表和子表约束(创建索引时,指定在删除、更新父表时,对子表进行的相应操作):
RESTRICT、NO ACTION:
限制在子表有关联记录的情况下父表不能更新
CASCADE表示父类在更新或者删除时,更新或者删除除子类对应记录。小心数据丢失
SET NULL:表示父表在更新或者或者删除的时候,子表的对应字段被SET NULL;小心数据丢失
3.存储方式
存储表和索引:
- 使用共享表空间存储。表结构保存在.frm文件中,数据和索引保存在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多文件。
- 使用多表空间存储。表结构保存在.frm 中,每个表的数据和索引单独保存在.ibd中。
MEMORY
MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件,格式是.frm。
MEMORY类型的表访问非常快,因为他的数据是放在内存中的,并且默认使用hash索引,但是一旦服务器关闭,表中的数据就会丢失。
MERGE
MERGE存储引擎是一组MyISAM表的组合,这些表必须具有相同的表结构,因为MERGE本身并没有数据,MERGE类型的表可以进行查询、更行、删除操作,实际是对内部的MyISAM表进行操作。