mysql 存储引擎 innodb和myISAM(转)

mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的存储引擎是myISAMhtml

innodb:mysql

1.事务操做
2.外键操做
3.行级锁,这是当有where条件的时候。没有where时,不知道在那一个范围进行搜索时,也是表锁.提供和 Oracle 同样的一致性的不加锁读取,能增长并发读的用户数量并提升性能,不会增长锁的数量。
4.写的速度快,这是创建在索引的更新操做上sql

5.InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其余全部基于磁盘的关系数据库引擎中最有效率的,在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中创建其专用的缓冲池用于高速缓冲数据和索引。 InnoDB 把数据和索引存放在表空间里,可能包含多个文件,这与其它的不同,举例来讲,在 MyISAM 中,表被存放在单独的文件中。InnoDB 表的大小只受限于操做系统的文件大小,通常为 2 GB。   
InnoDB全部的表都保存在同一个数据文件 ibdata1 中(也多是多个文件,或者是独立的表空间文件),相对来讲比较很差备份,免费的方案能够是拷贝数据文件、备份 binlog,或者用 mysqldump。   

数据库

myisam:安全

1.表级锁
2.读取速度快
3.索引压缩更好
4.更好和更快的auto_increment处理并发

myISAM的一个缺陷是崩溃后没法安全恢复。性能

MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名操作系统

COUNT() 在 MyISAM 表中会很是快,而在InnoDB 表下可能会很痛苦。而主键查询则在InnoDB下会至关至关的快,但须要当心的是若是咱们的主键太长了也会致使性能问题。大批的inserts 语句在 MyISAM下会快一些,可是updates 在InnoDB 下会更快一些——尤为在并发量大的时候。.net

myisam与innodb这两种引擎对索引的实现方式也不一样。设计

myiasm是使用B-树的结构来实现主码,非主码,惟一索引。

innodb是使用B+树结构来实现主码,用B-树来实现非主码。

如下是一些细节和具体实现的差异:

一、InnoDB不支持FULLTEXT类型的索引。

二、InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,可是MyISAM只要简单的读出保存好的行数便可。注意的是,当count(*)语句包含 where条件时,两种表的操做是同样的。

三、对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,可是在MyISAM表中,能够和其余字段一块儿创建联合索引。

四、DELETE FROM table时,InnoDB不会从新创建表,而是一行一行的删除。

五、LOAD TABLE FROM MASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,可是对于使用的额外的InnoDB特性(例如外键)的表不适用。

六、MyISAM的索引和数据是分开的,而且索引是有压缩的,内存使用率就对应提升了很多。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会形成Innodb比MyISAM体积庞大不小。

七、InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时mysql不能肯定要扫描的范围,InnoDB表一样会锁全表,例如update table set num=1 where name like “%aaa%”

使用两种的选择:若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,
应该使用InnoDB表。若是执行大量的SELECT,MyISAM是更好的选择。若须要使用事务处理,
可是原来的数据表使用的是myisam,就须要改成bdb或者innodb,这样基于myisam的程序,
将类型改成innodb后,其程序不用改动…… 综上所述,任何一种表都不是万能的,只有恰当的针对业务类型来选择合适的表类型,才能
最大的发挥MySQL的性能优点。

参考文献:http://www.cnblogs.com/myblog1314/archive/2013/06/05/3118370.html;

http://blog.csdn.net/xifeijian/article/details/20316775

相关文章
相关标签/搜索