MySQL存储引擎MyISAM与InnoDB区别总结整理
1、mysql默认存储引擎的变迁
在mysql 5.1之前的版本中,默认的搜索引擎是myisam,从mysql 5.5之后的版本中,默认的搜索引擎变更为innodb。
2、myisam与innodb存储引擎的主要特点
myisam存储引擎的特点是:表级锁、不支持事务和全文索引,适合一些cms内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;
以下是mysql 5.7 myisam存储引擎的版本特性:
innodb存储引擎的特点是:行级锁、事务安全(acid兼容)、支持外键、不支持fulltext类型的索引(5.6.4以后版本开始支持fulltext类型的索引)。innodb存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。innodb是为处理巨大量时拥有最大性能而设计的。它的cpu效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
以下是mysql 5.7 innodb存储引擎的版本特性:
注意:
innodb表的行锁也不是绝对的,假如在执行一个sql语句时mysql不能确定要扫描的范围,innodb表同样会锁全表,例如update table set num=1 where name like “a%”
。
两种类型最主要的差别就是innodb支持事务处理与外键和行级锁。而myisam不支持。所以myisam往往就容易被人认为只适合在小项目中使用。
3、myisam与innodb性能测试
下边两张图是官方提供的myisam与innodb的压力测试结果
可以看出,随着cpu核数的增加,innodb的吞吐量反而越好,而myisam,其吞吐量几乎没有什么变化,显然,myisam的表锁定机制降低了读和写的吞吐量。
4、事务支持与否
myisam是一种非事务性的引擎,使得myisam引擎的mysql可以提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用;
innodb是事务安全的;
事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而myisam就不可以了。
5、myisam与innodb构成上的区别
(1)每个myisam在磁盘上存储成三个文件:
第一个文件的名字以表的名字开始,扩展名指出文件类型,.frm文件存储表定义。
第二个文件是数据文件,其扩展名为.myd (mydata)。
第三个文件是索引文件,其扩展名是.myi (myindex)。
(2)基于磁盘的资源是innodb表空间数据文件和它的日志文件,innodb 表的 大小只受限于操作系统文件的大小,一般为 2gb。
6、myisam与innodb表锁和行锁的解释
mysql表级锁有两种模式:表共享读锁(table read lock)和表独占写锁(table write lock)。什么意思呢,就是说对myisam表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作;而对myisam表的写操作,则会阻塞其他用户对同一表的读和写操作。
innodb行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,innodb才使用行级锁,否则将使用表锁!行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源。在innodb两个事务发生死锁的时候,会计算出每个事务影响的行数,然后回滚行数少的那个事务。当锁定的场景中不涉及innodb的时候,innodb是检测不到的。只能依靠锁定超时来解决。
7、是否保存数据库表中表的具体行数
innodb 中不保存表的具体行数,也就是说,执行select count(*) from table
时,innodb要扫描一遍整个表来计算有多少行,但是myisam只要简单的读出保存好的行数即可。
注意的是,当count(*)
语句包含where
条件时,两种表的操作是一样的。也就是 上述“6”中介绍到的innodb使用表锁的一种情况。
8、如何选择
myisam适合:
- (1)做很多count 的计算;
- (2)插入不频繁,查询非常频繁,如果执行大量的select,myisam是更好的选择;
- (3)没有事务。
innodb适合:
- (1)可靠性要求比较高,或者要求事务;
- (2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况指定数据引擎的创建;
- (3)如果你的数据执行大量的insert或update,出于性能方面的考虑,应该使用innodb表;
- (4)delete from table时,innodb不会重新建立表,而是一行一行的 删除;
- (5)load table from master操作对innodb是不起作用的,解决方法是首先把innodb表改成myisam表,导入数据后再改成innodb表,但是对于使用的额外的innodb特性(例如外键)的表不适用。
要注意,创建每个表格的代码是相同的,除了最后的 type参数,这一参数用来指定数据引擎。
其他区别:
1、对于auto_increment类型的字段,innodb中必须包含只有该字段的索引,但是在myisam表中,可以和其他字段一起建立联合索引。
2、delete from table时,innodb不会重新建立表,而是一行一行的删除。
3、load table frommaster操作对innodb是不起作用的,解决方法是首先把innodb表改成myisam表,导入数据后再改成innodb表,但是对于使用的额外的innodb特性(例如外键)的表不适用。
4、 innodb存储引擎被完全与mysql服务器整合,innodb存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。
5、对于自增长的字段,innodb中必须包含只有该字段的索引,但是在myisam表中可以和其他字段一起建立联合索引。
6、清空整个表时,innodb是一行一行的删除,效率非常慢。myisam则会重建表。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
下一篇: docker 详解设置容器防火墙
推荐阅读
-
MySQL存储引擎以及MyISAM与InnoDB的区别详解
-
Mysql InnoDB引擎的索引与存储结构详解
-
MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
-
MySQL MyISAM 与InnoDB 的区别
-
Mysql更换MyISAM存储引擎为Innodb的操作记录总结
-
mysql数据库引擎MyISAM与InnoDB之间的区别
-
荐 MySQL - 常用存储引擎区别总结(2020最新版)
-
MySQL存储引擎MyISAM与InnoDB区别总结整理
-
MySQL 学习总结 之 初步了解 InnoDB 存储引擎的架构设计
-
重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现