MySQL存储引擎

来源:互联网 发布:赛亚人遮脸的软件 编辑:程序博客网 时间:2024/04/27 18:14

和大多数数据库不同,MySQL中有一个插件式存储引擎的概念,针对不同的存储需求可以选择最优的存储引擎。

MySQL和其他数据库的区别一览



其中,MySQL中并不是所有的存储引擎都支持上述功能,各存储引擎之间的差异如下:



可以在创建表的时候指定表的存储引擎,如果不指定,则使用默认的存储引擎,使用show engines \G命令查看MySQL支持的存储引擎以及默认的存储引擎。


各字段说明:Engine是引擎名称、Support表示当前支持状态(YES表示支持、NO表示不支持,DISABLED表示支持但是服务器启动时关闭,DEFAULT表示默认存储引擎),Comment表示一些说明事项、Transactions表示是否支持事务、XA表示是否支持分布式存储、Savepoints表示是否支持事务回滚。

创建指定引擎类型(下表创建了一个MyISAM类型的表)的表。


创建完成后,会在数据库目录下面生成相应的数据库表文件,不同的存储引擎表,对应生成的文件类型也是不一样,对应关系如下


在MySQL命令行模式下可以使用show variables like '%dir%';命令查看存储路径,其中变量 datadir 的value就是数据库表的存储路径。


1、MyISAM存储引擎

MyISAM引擎是不支持事物、也不支持外键,其优势是访问的速度快,对事物的完整性没有要求或者以Select、insert为主的应用基本上都可以使用这个引擎创建表。数据文件和索引文件分放在不同的文件中,平均IO,从而获得更快的访问速度,故障恢复相对比较困难。MyISAM表还支持3种不同的存储格式,分别是:静态表、动态表和压缩表。其中,静态表存储的时候固定长度,浪费空间,返回结果的时候去掉尾部空格,需注意。动态表占用空间较少,但是频繁更新删除会产生碎片,需要定期执行OPTIMIZE TABLES命令来改善性能。


2、InnoDB存储引擎

InnoDB引擎提供了具有提交、回滚和崩溃恢复能力的事务支持以及外键完整性约束。并且支持行级别的锁定,但是处理起来的效率差一些,而且会占用更多的磁盘空间用来保留数据和索引。

在InnoDB表中如果是自动增长列(auto_increment),必须是索引,如果是组合索引则自动增长列必须是组合索引的第一项(如下所示),并且MySQL中每张表只能存在一个自动增长列。


InnoDB的外键约束支持,级联操作有RESTRICT、CASCADE、SETNULL和NO ACTION,其中,RESTRICT和NO ACTION相同是指在子表有记录的时候父表不能更新,CASCADE表示父表在更新或者删除的时候更新或者删除子表中对应的数据,SETNULL表示父表在更新或者删除的时候,子表中对应的记录字段被set null。后两种需谨慎使用,不当操作会导致数据丢失。


3、Memory存储引擎

Memory引擎把所有数据保存在内存中,因此不使用于大量数据的存储,而且在数据库服务器断电后,保存的数据就会消失(表结构不消失,这就是为什么Memory生成的文件只有一个*.frm表结构定义文件的原因),默认情况使用HASH散列索引,对于“相等比较”(=和!=)速度较快,范围比较速度较慢。Memory使用长度固定的存储格式,不能使用TEXT和BLOB类型,对于Varchar类型也是在内部当作char类型来处理。


4、Merge存储引擎

Merge引擎提供了把多个MyISAM表当作一个逻辑单元来处理的手段。查询Merge表相当于查询对应的MyISAM表。Merge表包含两个文件标定一文件(*.frm)和组表信息(*.MRG)


继续创建表使用like创建表log_2006、log_2007,并向其中插入一些数据,然后如下创建merge表


默认情况下,上述merge表只能进行update、delete不能insert,在上述定义最后的时候可以加上insert_method=first选项(first表示插入数据在第一个merge表鸡log_2004,除了first还有last取值和no默认值)则可以插入。对merge表的操作实际上都转化成对相应组合表的操作。还有一种partition分区数据表与merge表相似,都可以用来访问被存储在不同地点的多个数据表的内容。区别是每个partition表都是货真价实的表文件,而不是逻辑构成,partition表也支持除MyISAM外的其他的存储引擎。

综述:



0 0
原创粉丝点击