Mysql的存储引擎

来源:互联网 发布:sql查询不显示重复数据 编辑:程序博客网 时间:2024/05/22 06:40

InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务,短期事务大部分情况是正常提交的,很少会被回滚。InnoDB具有自动崩溃恢复特性。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。


InnoDB采用MVCC(Multi-Version Concurrency Control)来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。InnoDB的存储格式是平台独立的,也就是说可以将数据和索引文件从Intel平台复制到PowerPC或者Sun SPARC平台。


MyISAM不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。尽管MyISAM引擎不支持事务、不支持崩溃后的安全操作,但它绝不是一无是处的。对于只读的数据,或者表比较小、可以忍受修复(repair)操作,则依然可以继续使用MyISAM(但请不要默认使用MyISAM,而是应当默认使用InnoDB)。


总结:

主要区别:

1.MyISAM是非事务安全型的,而InnoDB是事务安全型的

2.MyISAM的锁粒度是表级,而InnoDB支持行级锁定

3.MyISAM支持全文类型索引,而InnoDB不支持全文索引

4.MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM

5.MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。

6.InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务到事务表(alter table tablename type=innodb).

应用场景:

1.MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的select查询,那么MyISAM是更好的选择。

2.InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的insert或update操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。


两者执行select count(*) from table 时,哪个更快,为什么?

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


补充:

Memory引擎:

特点:速度快;至少比MyISAM表快一个数量级,所有的数据保存在内存中。Memory表的结构在重启以后还会保留,但数据会丢失。它支持哈希和B树索引,Memory表是表级锁,因此并发写入的性能较低。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOBTEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。

适用场景:

1. 目标数据较小,而且被非常频繁地访问。

2. 当需要使用临时表来保存查询过程中的中间结果时,内部使用的临时表就是Memory表。如果中间结果大大超出了Memory表的限制,或者含有BLOBTEXT字段,则临时表会转换为MyISAM表。

3. 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

MERGE存储引擎:

特点:MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。

适用场景:

日志或数据仓库类应用。对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。

参考链接:

http://www.jb51.net/article/55849.htm

原创粉丝点击