innodb和myisam与innodb的区别的区别.底层实现结构上有什么区别

MySQL存储引擎中的MyISAM和InnoDB区别详解
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了MySQL存储引擎中的MyISAM和InnoDB区别详解,本文总结了MyISAM与InnoDB的11点区别,需要的朋友可以参考下
在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问。为了解开这个谜题,搜寻了网络,找到了如下信息:
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(*)会直接取出出该值。
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这个命令。
MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具博客访问: 47537
博文数量: 76
博客积分: 0
博客等级: 民兵
技术积分: 702
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Mysql/postgreSQL
一、构成上的区别:
1、MyISAM:每张表被存放在三个文件,扩展名为.frm 存放表定义,扩展名为.MYD (MYData)存放数据文件,扩展名是.MYI (MYIndex)存放索引文件;
2、InnoDB:ibdata1 存储数据与索引的数据文件,ib_logfile0与ib_logfile1 日志文件
二、事务处理上方面:
1、MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持;
2、InnoDB提供事务支持事务,外部键等高级数据库功能
三、sql操作:如果执行大量的SELECT,MyISAM是更好的选择,如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表
四、对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引
1、MyISAM:支持表锁
2、InnoDB:支持表锁和行锁,如果执行sql语句时MySQL不能确定要扫描的范围,InnoDB表会锁全表
六、表的具体行数:
select count(*) from table,MyISAM只要简单的读出保存好的行数;
InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行;
注意的是,当count(*)语句包含where条件时,两种表的操作是一样的。
阅读(35) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。b-tree,b是balance,一般用于数据库的索引。使用b-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度
myisam引擎使用b+tree作为索引结构,叶节点的data域存放的是数据记录的地址
myisam索引的原理图:
innodb索引实现
虽然innodb也使用b+tree作为索引结构,但具体实现方式却与myisam截然不同
第一个重大区别是innodb的数据文件本身就是索引文件。从上文知道,myisam索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在innodb中,表数据文件本身就是按b+tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此innodb表数据文件本身就是主索引
第二个与myisam索引的不同是innodb的辅助索引data域存储相应记录主键的值而不是地址。换句话说,innodb的所有辅助索引都引用主键作为data域
InnoDB索引原理图
& &-主键索引/非主键索引
& & 叶子节点上均带有行号,通过行号进行索引
& &-主键索引(聚簇索引) & & &叶子节点上带有数据
& &-非主键索引(第二索引) & &叶子节点上带有主键id
myisam属于堆表,数据写入一直累积(concurrent_insert参数设置为2);此时写入性能比innodb好,但是无论是主键查询还是非主键查询,都不可避免的需要二次io(除非能索引内完成字段记录返回)
innodb属于聚簇索引组织表(主键索引即数据),由于必须保证索引有序,在写入时需要找到合适的位置进行插入,有时候还会导致二叉树调整所以写入性能比myisam要差;但是主键查找时只需要一次io即可返回数据,非主键索引查询时如果在索引内不能完成查询记录返回则需要第二次的io
本文已收录于以下专栏:
相关文章推荐
13.5.3. SET语法SET variable_assignment [, variable_assignment] ... variable_assignment:      user_var_...
监控/审计有哪些用户连接mysql数据库 18:18不开启查询日志,监控/审计有哪些用户连接mysql数据库 init_connect 释义: Client端每次连接到数据库时,M...
学校里做的项目都是默认MySQL的InnoDB存储引擎,没有思考过为什么使用,也没思考过其优缺和其他数据库存储引擎。直到我去实习了,在学习优化的过程中,才发现自己很无知,知识很局限。为此做次弥补。
mysql存储过程中,定义变量有两种方式:
1.使用set或select直接赋值,变量名以 @ 开头.
例如:set @var=1;
可以在一个会话的任何地方声明,作用域是整个会话,称为会话变量。
Mybatis中javaType和jdbcType对应关系
好记性不如烂笔头,留下备忘。
纸上得来终觉浅
1.前言:上篇讲到Mysql中关键字执行的顺序,只涉及了一张表;实际应用大部分情况下,查询语句都会涉及到多张表格 :
1)多表连接有哪些分类;
2)针对这些分类有哪些连接方法?
MAKE_SET(bits,str1,str2,...)
返回一个设定值 (一个包含被‘,’号分开的字字符串的字符串) ,由在bits 组中具有相应的比特的字符串组成。str1 对应比特 0,...
MySQL 中的 SET 与 ENUM 类型使用详解
一、SET类型
在创建表时,就指定SET类型的取值范围。
属性名 SET('值1','值2','值3'...,'值n')
其中,“属性名”...
继续这个Lucene总结系列吧。今天要讲的是一个Lucene的业务全程操作,然后这系列的以后都是以Lucene优化以及原理为主了。OK,开始!!!
本篇将讲述一个普遍的lucene检索实现。主要是IK...
在游标里面我们有简要的介绍了一个NOT FOUND这个条件处理(错误、异常处理)的情况,条件处理涉及到两个语句,一个是DECLARE...CONDITION,另一个是DECLARE....HANDLE...
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)MyIsam与InnoDB主要有以下4点大的区别,缓存机制,事物支持,锁定实现,数据物理存储方式(包括索引和数据)。
1.缓存机制
myisam 仅仅缓存索引,不会缓存实际数据信息,他会将这一工作交给OS级别的文件系统缓存。所以mysiam缓存优化工作集中在索引缓存优化上。
InnoDB 有自己的缓存(buffer pool),不仅仅缓存索引,还缓存表数据。
(由于myisam不会缓存表数据文件(.MYD),每次读取数据文件都需要调用文件系统的相关指令从磁盘上读取物理文件。所以每次读取数据文件所需的内存缓冲区的设置就对数据文件的访问性能非常重要。mysql提供了以下两种读取数据文件缓冲区,Sequential Scan方式(如全表扫描)Random Scan(如通过索引扫描),这两个缓冲区不是某个存储引擎特有的,都是线程独享,每个线程在需要的时候都会创建一个(或者两个)系统中设置设置大小的缓冲区。)
2.事物支持
myisam 不支持事物。
InnoDB 支持事物,也支持主外键。
3.锁定实现
myisam 锁定是由mysql服务控制,只支持表级锁。
innoDB 锁定交由InnoDB存储引擎,支持行级锁,页级锁等粒度更小的锁定级别。由于锁定级别的差异,在更新并行度上InnoDB会比myisam好很多
4.数据物理存储方式(包括索引和数据)。
1,文件存放方式
myisam 每个表有三个文件,.frm 存放表结构数据.MYI 存放索引信息.MYD存放表数据
innodb 存储数据有.FRM存放表定义,.ibd(独享表空间),.ibdata(共享表空间).innodb存储数据分独立表空间和共享表空间(具体使用哪个由innodb_file_per_table变量确定),独享表空间存储方式使用&.ibd&文件来存放数据,且每个表一个&.ibd&文件,文件存放在和MyISAM 数据相同的位置,由datadir确定。如果选用共享存储表空间来存放数据,则会使用ibdata 文件来存放,所有表共同使用一个(或者多个,可自行配置)ibdata 文件。ibdata 文件可以通过innodb_data_home_dir 和innodb_data_file_path两个参数共同配置组成, innodb_data_home_dir 配置数据存放的总目录。
2,表数据物理存放方式
myisam 表数据存放在.MYD文件里,没有使用页来存储数据,也没有表空间的概念。myisam没有聚集索引。myisam有三种存储格式:静态格式,动态格式,压缩格式。
InnoDB 将所有数据存放在数据页中(page),一般情况下非压缩页大小16K。InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。innod有共享表空间和独享表空间之分,由innodb_file_per_table参数控制。以下为InnoDB的表空间结构图:
InnoDB 行,页,集合,段,表空间之间的关系
3,索引数据存储方式
MyIsam 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。主索引和辅助索引没有区别都是非聚集索引。索引页正常大小为1024字节,索引页存放在.MYI 文件中。MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:(借图)
InnoDB 也使用B+Tree作为索引结构,索引页大小16,和表数据页共同存放在表空间中。从InnoDB表数据存放方式可看出InnoDB表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。下图是主索引也就是表数据本身的结构图(借的blog.codinglabs.org)也可以称为聚集索引
下图是辅助索引结构图:
以上参考mysql 核心内幕总结的,有不对的地方欢迎拍砖。
阅读(...) 评论()如果不清楚自己应该用什么引擎,那么请选择InnoDB,Mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的引擎是MyISAM
MyISAM 和 InnoDB的适用场景
MyISAM适合:(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况。
MyISAM 和 InnoDB的区别
1)MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持
2)mysiam表不支持外键
3)在执行数据库写入的操作(insert,update,delete)的时候,mysiam表会锁表,而innodb表会锁行
4)当你的数据库有大量的写入、更新操作而查询比较少或者数据完整性要求比较高的时候就选择innodb表。当你的数据库主要以查询为主,相比较而言更新和写 入比较少,并且业务方面数据完整性要求不那么严格,就选择mysiam表。因为mysiam表的查询操作效率和速度都比innodb要快
阅读(...) 评论()

我要回帖

更多关于 myisam 转 innodb 的文章

 

随机推荐