MySql存储引擎是什么?
其实,我们可以通俗的理解成存储技术或者存储策略,mysql可以对不同的表使用不同的存储策略,来管理表数据,从而达到不同的使用感受。
以下是百度百科解释:
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
MySql存储引擎有哪些?
不同的mysql版本所支持的存储引擎略有差异,我们可以自己查询当前mysql所支持的存储引擎,命令:show engines;
我当前使用的mysql版本是5.6.43,默认引擎是InnoDB,而在早期的mysql版本(有说5.1之前,有说5.5之前的,我没有自己测过,不过这不重要,重要的是会自己查看)中默认引擎是MyISAM。
Mysql可以自己设置默认引擎,也可以建表时指定,具体方法如下:
1.设定数据库默认引擎
修改mysql安装目录中的配置文件my.ini或my.cnf,在配置文件的[mysqld]配置下新增default-storage-engine=InnoDB,保存后重启服务。
2.建表时指定引擎
create table test(id int)engine=MyISAM;
3.修改已建表的引擎
alter table test engine=InnoDB;
上面的engine关键字也可以用type,不过type是早期的关键字,已经不建议使用。
各类存储引擎介绍
存储引擎 | 特点介绍 |
---|---|
innodb | 1.是mysql唯一支持事务的引擎; 2.支持行锁,所以支持并发读写; 3.有且仅有一个聚簇索引(key一般都是主键),其叶子节点存放具体数据;其他索引为二级索引(辅助索引),叶子节点存放聚簇索引中的key值; 4.缓存数据; |
myisam | 1.对表数据行数单独记录,所以大表count(*)会很快; 2.不支持行锁,支持表锁,所以修改操作都是全表的排他锁,并发性能不好; 3.非聚簇索引,主键和其他索引节点保存的都是数据行在内存中的物理地址 4.只缓存索引,不缓存数据; |
mrg_myisam | 它是一组相同表结构的myisam表的集合,有点像视图,定义和删除都不会影响原数据,是对它所管理的所有myisam表的union操作。 |
memory | memory表数据存储在内存中,所以读写性能很高,但是内存占用率高,而且数据库重启后数据会丢失,适合临时表。 |
blckhole | 黑洞,任何写入的数据都会消失,select操作永远得不到数据,但是会记录binlog日志,可用于日志分析,也可以用于主从架构中实现数据同步。 |
archive | 1.只允许插入和查询,不能修改和删除; 2.只支持自增ID列上加索引; 3.提供压缩功能,数据占用磁盘空间更少; 4.性能很高,如果有数据不让修改和删除,可以考虑使用; |
csv | 1.数据以csv文本方式存储(不同于其他引擎的二进制存储),可以直接编辑相应的文件进行修改; 2.所有列不能为null,不支持索引; |
不管是哪种引擎,对应的表结构都会保存在{tableName}.frm文件中,路径通常为mysql/data/{dbName}/{tableName}.frm
InnoDB和MyISAM
Mysql存储引擎很多,但是最长用的还是innodb,而一般讨论较多的则是innodb和myisam,下面就几点分析二者的差异;
1.innodb支持标准ACID事务,适合于我们开发中很多需要事务的场景,而myisam本身不支持事务,如果使用,我们需要自己在代码层面去做控制;
2.innodb支持行锁,而myisam直接是表锁,意味着,当并发操作高时,myisam性能会很差,myisam适合多读操作;
3.myisam会单独存储表数据总数,而innodb不会,所以当我们对大表进行select count(*)时,myisam直接返回计数,性能很高,而innodb需要全表扫描统计,故而性能差;当然当我们select count(*)带有where条件时,两者差不多;
4.innodb表结构文件名为{tableName}.frm,数据和索引共存一个文件{tableName}.ibd;
myisam表结构文件名为{tableName}.frm,索引文件为{tableName}.MYI,数据文件为{tableName}.MYD;
5.innodb使用的是聚簇索引,myisam使用非聚簇索引,关于聚簇索引和非聚簇索引请参考:https://blog.csdn.net/firstendhappy/article/details/104626361
6.innodb崩溃恢复能力好,而myisam相对很差(myisam只将数据写到内存中,再由操作系统定期写到磁盘上)。