MySQL存储引擎--MyISAM与InnoDB区别

news/2025/2/12 18:23:58

MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。

MyISAM与InnoDB的区别是什么?

1、 存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

2、 存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3、 可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

4、 事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

5、 AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

6、 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

7、 全文索引

MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

8、 表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

9、 表的具体行数

MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

10、 CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

11、 外键

MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

存储引擎选择的基本原则

采用MyISAM引擎

  • R/W > 100:1 且update相对较少

  • 并发不高

  • 表数据量小

  • 硬件资源有限

采用InnoDB引擎

  • R/W比较小,频繁更新大字段

  • 表数据量超过1000万,并发高

  • 安全性和可用性要求高

采用Memory引擎

  • 有足够的内存

  • 对数据一致性要求不高,如在线人数和session等应用

  • 需要定期归档数据

     摘自:《PHP核心技术与最佳实践》
    

https://dhexx.cn/news/show-3615235.html

相关文章

ssms mysql_SQL Server Management Studio(SSMS)复制数据库的方法

利用SQL Server Management Studio(SSMS)复制数据库,供大家参考,具体内容如下前言今天由于客户购买的软件版本确认了,而之前进行开发的本地数据库版本较低,打算复制一份开发数据库,升级为客户软件版本的数据库再进行后…

用java写一个快排算法

这是一个 Java 实现的快速排序算法&#xff1a; public void quickSort(int[] array, int left, int right) {if (left < right) {int pivotIndex partition(array, left, right);quickSort(array, left, pivotIndex - 1);quickSort(array, pivotIndex 1, right);} }priva…

django mysql blob存入_用django和sqli存储BLOB数据

首先&#xff0c;我知道有很多类似的问题&#xff0c;但是其他的解决方案并没有涵盖我的具体情况&#xff1a;在我的sqlite数据库中有现有的二进制数据(SHA1和类似的散列)。通过谷歌搜索和阅读django-docs我得出了以下结论&#xff1a;import base64class BlobField(models.Fie…

2021年N1叉车司机找解析及N1叉车司机考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;N1叉车司机找解析考前必练&#xff01;安全生产模拟考试一点通每个月更新N1叉车司机考试试卷题目及答案&#xff01;多做几遍&#xff0c;其实通过N1叉车司机很简单。 1、【多选题…

工作改进方法及效果怎么写

工作改进方法是指采取的措施&#xff0c;以提高工作效率和质量。这些措施可以是技术上的&#xff0c;也可以是管理上的。 具体的工作改进方法可以包括&#xff1a; 引入新技术&#xff1a;通过掌握新技术或设备&#xff0c;可以提高工作效率和质量。 改进流程&#xff1a;通过分…

2017年度专业技术人员资格考试时间安排

为什么80%的码农都做不了架构师&#xff1f;>>> 附件 2017年度专业技术人员资格考试工作计划 序号 专业名称 考试日期 1 咨询工程师&#xff08;投资&#xff09; 4月15、16日 2 注册建筑师 一级 5月6、7、13、14日 二级 5月6、7日 3 护士执业资格 5…

mysql如何看sql性能_怎么查看一个mysql的sql语句的性能

SQL> DECLARE2 TYPE refcursor IS REF CURSOR;3 v_cursor REFCURSOR;4 v_Sql VARCHAR(200);5 v_name VARCHAR(10);6 BEGIN7 -- 动态SQL8 v_Sql : SELECT name FROM test_dysql;9 -- 打开游标.10 OPEN v_cursor FOR v_SQL;11 -- 循环处理.12 LOOP13 -- 填充数据.14 FETCH v_c…

2021年低压电工考试题及低压电工模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;2021年低压电工考试题为正在备考低压电工操作证的学员准备的理论考试专题&#xff0c;每个月更新的低压电工模拟考试祝您顺利通过低压电工考试。 1、【单选题】一般照明的电源优先…

requests发送请求时携带 headers 参数及作用?

在使用 Python 的 requests 库发送 HTTP 请求时&#xff0c;可以使用 headers 参数来携带 HTTP 请求头信息。 HTTP 请求头信息包含了有关客户端浏览器、操作系统、接受的内容类型和版本等信息&#xff0c;这些信息可以帮助服务器理解客户端的需求&#xff0c;并返回合适的响应。…

关于AngularJS学习整理---核心特性

接触、学习AngularJS已经三个多月了&#xff0c;随着学习的深入&#xff0c;有些东西刚开始不明白&#xff0c;现在开始慢慢明白起来。于是&#xff0c;开始整理这几个月的学习成果。要不又要忘了。。。 初学Angular&#xff0c;是看到慕课网大漠穷秋老师教程学的&#xff0c;以…