MySQL针对不同的存储需求可以选择最优的存储引擎,用户可以根据应用的需要选择如何存储和索引数据,是否使用事务等,可以选择不同的存储引擎提高应用的效率。
两种方式查看当前数据库支持的存储引擎
1.show engines G;
2.show variables like 'have%';
其中value显示为disabled的记录表示支持该存储引擎,但是数据库启动的时候就被禁用
1. 1.如何给表添加存储引擎?
在创建新表的时候可以通过增加ENGINES
关键字设置新建表的存储引擎和字符编码,MySQL在V5.1
之前默认存储引擎是MyISAM
;在此之后默认存储引擎是InnoDB
,默认的字符编码是utf8mb4_0900_ai_ci
。
create table ai(i bigint(20) not null auto_increment,primary key(i)) engine=MyISAM default charset=utf-8;
1. 2.如何查看表和数据库所使用的存储引擎?
对于数据库,使用:
show table status from databasename;
如果想要查询具体的表,则使用:
show table status from databasename where name='tablename';
可以使用Alter table语句修改已经存在表的存储引擎
alter table tablename engine=Innodb;
1. 3.各种存储引擎的特性
3.1
MyISAM
MyISAN不支持事务,也不支持外键,其优势是访问速度快,对事务的完整性没有要求,以select
和 insert
为主的应用基本都可以使用这个存储引擎来创建表。
MyISAM的表还支持三种不同的存储格式,分别是:
- 静态表
- 动态表
- 压缩表
静态表是默认的存储格式,静态表钟的字段都是非变长字段,每个记录都是固定长度的,优点是:存储非常迅速,容易缓存,出现故障容易恢复,缺点是占用的空间通常比动态表多,静态表的数据在存储是会按照宽度定义补足空格,但是应用访问时并不会得到这些空格,在返回给应用之前已经去掉。
特别注意
如果需要保存的数据本身就带有空格,那么在返回结果时也会被去掉!
动态表中包含变长字段,记录不是固定长度的,这样的存储优点是占用的空间较少!但是频繁的删除会产生碎片,需要定期执行 OPTIMIZE TABLE
语句来改善性能。
压缩表由myisampack
工具创建,占据非常小的磁盘空间,因为每个记录都是被单独压缩的所以只有非常小的访问开支!
3.2
InnoDB
innoDB
存储引擎提供了具有提交回滚和崩溃恢复能力的事务安全,但是对比MyISAM的存储引擎,InnoDB
写的处理效率差一些并且会占用更多磁盘空间以保留数据和索引。
3.2.1 自动增长列
InnoDB
表的自动增长列可以手动插入,但是插入的值如果是空或者0,则实际插入的值将是自动增长后的值。对于Innodb
表,自动增长列必须是索引,如果是组合索引,也必须是组合索引的第一列。
但是对于MyISAM
表,自动增长列可以是组合索引的其他的列,这样插入记录以后,自动增长列是按照组合索引的前面几列进行排序后递增的。
3.2.1 外键约束
MySQL中支持外键的存储引擎只有Innodb,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引,子表在创建外键时候也会自动创建对应的索引。
3.3.3存储方式
- 共享表空间存储
- 使用多表空间存储
3.3
MEMORY
MEMORY存储引擎使用存在内存中的内容来创建表,每个MEMORY表实际上只对应一个磁盘文件,格式是.frm。MEMORY类型的表访问非常的快,因为他的数据是放在内存中的,并且默认使用Hash索引,但是一旦服务关闭,数据丢失。
1.4.如何选择合适的存储引擎
在选择存储引擎时,应该根据应用特点选择合适的存储引擎,对于复杂的应用系统可以根据实际需要选择多种存储引擎进行组合。
-
MyISAM:如果应用时以读操作和插入操作为主,
只有很少的更新和删除操作,并且对事务的完整性,并发性要求并不高,可以选择MyISAM,
他也是最常用的存储引擎之一。 -
InnoDB:用于事务处理应用程序,支持外键,
如果应用是以事务完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询以外,还包括很多的更新,删除操作,对于类似的计费系统或者财务系统等对数据准确性要求比较高的系统,那么InnoDB是合适的选择,
他除了有效的降低由于删除和更新导致的锁定,还可以确保事务的完整提交和回滚。 -
MEMORY:
将所有的数据存在RAM中,在需要快速定位记录和其他类似的数据,可以提供极快的访问
,MEMORY的缺陷是对表的大小有限制,太大的表无法存在cache中,其次要确定表的数据可以恢复,数据库异常终止后表中的数据是可以恢复的。MEMORY通常用于更新不太频繁的小标,用以快速得到访问结果!