InnoDB与MyISAM总结和对比

Mysql的数据库引擎在我的博客中曾经有过陈述,但只是对所有引擎的一个简单叙述,而InnoDB与MyISAM数据库引擎是我们平时使用最多的,有必要进行详细全面的介绍和对比,以便我们在选择数据库引擎时能够根据需求更好地选择。

InnoDB

特点:

支持ACID事务(具有提交,回滚和崩溃恢复能力),支持存储过程,视图,支持行级锁定支持外键,处理巨大数据量时拥有最大性能(可以说它的CPU效率是其他基于磁盘关系数据库引擎所不能匹敌的),表可以是任何尺寸,不支持全文类型的索引,插入缓冲、二次写、自适应哈希索引(三个特性详细介绍见: InnoDB的三个关键特性 (http://blog.csdn.net/z702143700/article/details/46049101)。

应用场景:

  1. 以INSERT、UPDATE为主的应用。
  2. 在需要高性能的大型数据库的应用中。
  3. 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
  4. 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
  5. 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
  6. 外键约束。MySQL支持外键的存储引擎只有InnoDB。
  7. 支持自动增加列AUTO_INCREMENT属性。

注:InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”,select count(*) 、order by等也会锁表。而行级锁,一般只在涉及到索引的时候才会被使用

比如:where条件中含索引字段时,就是行锁。其他情况都是表锁。

MyISAM

特点:

较高的查询速度,表级锁定;BLOB和TEXT列可以被索引;不支持事务,不支持外键;支持全文索引,支持3种不同的存储格式:静态(固定长度)表、动态表、压缩表;

静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面到空格会被自动处理掉。

动态表包含变长字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁到更新删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。

  压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

应用场景:

  1. 对事务完整性没有要求或者以SELECT为主的应用。
  2. 无事务要求,但对效率要求比较高的应用。

注:NULL值被允许在索引的列中,这个占每个键的0-1个字节。

InnoDB和MyISAM对比:

  1. InnoDB可以利用事务日志进行数据恢复,这会比较快。而MyISAM可能会需要几个小时甚至几天来干这些事,InnoDB 只需要几分钟。但是在某些场景MyISAM似乎更方便高效,因为它可以直接拷贝frm.MYD,MYI文件,然后在对于版本的数据中启动就可以使用了。比如,数据表损坏,迁移,还原数据只要拷贝文件就可以了。而InnoDB要考虑字典数据的影响,拷贝文件的方式无效,如果导出.sql文件,会耗费大量的时间。
  2. InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。
  3. 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
  4. DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
  5. LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
  6. MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
  7. InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。
  8. MyISAM表是使用B型树索引,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址,也叫做“非聚集索引”。
  9. InnoDB也使用B+Tree作为索引结构,这棵树的叶节点data域保存了完整的数据记录。它的索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引,也叫做“聚集索引”。MyISAM和InnoDB索引实现详细对比 ,见博客http://blog.csdn.net/z702143700/article/details/46049101
时间: 2024-11-05 21:44:09

InnoDB与MyISAM总结和对比的相关文章

【Todo】InnoDB、MyISAM、数据库引擎

关于InnoDB和MyISAM引擎的对比,下面这篇讲的挺好 http://www.cnblogs.com/vicenteforever/articles/1613119.html 这一篇关于InnoDB细节的仔细看: http://jingyan.baidu.com/article/fedf07377c493f35ac89770c.html

InnoDB与MyISAM等存储引擎对比

文章原文:blog.ouyangsihai.cn >> InnoDB与MyISAM等存储引擎对比 InnoDB存储引擎介绍 InnoDB引擎是Mysql的默认的存储引擎,他有很多自己的特性,下面一一列举. 支持事务,InnoDB存储引擎主要就是为了在线事务处理(OLTP)的应用而设计的. 行锁设计,支持外键,非锁定读. 支持多版本的并发控制(MVCC)来获得高并发性. 提供了插入缓冲.二次写.自适应哈希索引.预读等高性能和高可用的功能. 上面这些算是 InnoDB 存储引擎的一些特点了,也是它

[转帖]InnoDB与MyISAM等存储引擎对比

InnoDB与MyISAM等存储引擎对比 https://blog.ouyangsihai.cn/innodb-yu-myisam-deng-cun-chu-yin-qing-dui-bi.html InnoDB存储引擎介绍 InnoDB引擎是Mysql的默认的存储引擎,他有很多自己的特性,下面一一列举. 支持事务,InnoDB存储引擎主要就是为了在线事务处理(OLTP)的应用而设计的. 行锁设计,支持外键,非锁定读. 支持多版本的并发控制(MVCC)来获得高并发性. 提供了插入缓冲.二次写.自

mysql中innodb和myisam对比及索引原理区别(转)

InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了 1.事务和外键 InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID.如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能 MyISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择 2.全文索引 I

警惕 InnoDB 和 MyISAM 创建 Hash 索引陷阱

MySql 常见存储引擎 InnoDB 和 MyISAM 都不支持 Hash 索引,它们默认的索引都是 B-Tree.但是如果你在创建索引的时候定义其类型为 Hash,MySql 并不会报错,而且你通过 SHOW CREATE TABLE 查看该索引也是 Hash,只不过该索引实际上还是 B-Tree.比如表 data_dict 的 DDL: CREATE TABLE `data_dict` ( `data_type` varchar(32) NOT NULL COMMENT '数据字典类型',

INNODB与MyISAM两种表存储引擎区别

mysql数据库分类为INNODB为MyISAM两种表存储引擎了,两种各有优化在不同类型网站可能选择不同,下面小编为各位介绍mysql更改表引擎INNODB为MyISAM技巧. 常见的mysql表引擎有INNODB和MyISAM,主要的区别是INNODB适合频繁写数据库操作,MyISAM适合读取数据库的情况多一点,如何把表引擎INNODB更改为MyISAM呢? 使用以下mysql sql语句,可以给表设定数据库引擎: ALTER TABLE `wp_posts` ENGINE = MyISAM;

(转)InnoDB与MyISAM引擎区别

MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比 2015年06月25日 21:58:42 阅读数:1827更多 个人分类: mysql 1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合. 2.InnoDB:支持事务安全的引擎,支持外键.行

MySQL之存储引擎InnoDB和MyISAM的区别及底层详解(转)

题外话:中华文化博大进深,从学Java到数据库,无一不体现出同一组件鱼和熊掌不可兼得的要义.自然,编程中安全和效率也很难同时做到完美,这一次InnoDB和MyISAM又让我大开眼界. 好了,Talk is cheap,show you the code: 测试环境:Mysql 5.7.20-log,IDEA 2018 首先创建两张表: testinnodb,testmyisam,sql如下: 1.同时大批量插入数据(百万级,million),小编采用了存储过程,代码及测试结果如下: 下面代码在I

InnoDB与Myisam比较

InnoDB与Myisam比较                                                                                                            MyISAM   InnoDB   构成上的区别:   每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (