MySQL 经常使用数据存储引擎区别

MySQL 有多种存储引擎,目前经常使用的是 MyISAM 和 InnoDB 这两个引擎,除了这两个引擎觉得还有许多其余引擎,有官方的,也有一些公司本身研发的。这篇文章主要简单概述一下经常使用常见的 MySQL 引擎,一则这是面试中常被问到的问题,二则这也是数据库设计中不可忽略的问题,用合适的引擎能够更好的适应业务场景,提升业务效率。mysql

MyISAM

MyISAM 是 MySQL 5.5.5 以前的默认引擎,它支持 B-tree/FullText/R-tree 索引类型。面试

锁级别为表锁,表锁优势是开销小,加锁快;缺点是锁粒度大,发生锁冲动几率较高,容纳并发能力低,这个引擎适合查询为主的业务。sql

此引擎不支持事务,也不支持外键。数据库

MyISAM强调了快速读取操做。它存储表的行数,因而SELECT COUNT(*) FROM TABLE时只须要直接读取已经保存好的值而不须要进行全表扫描。缓存

InnoDB

InnoDB 存储引擎最大的亮点就是支持事务,支持回滚,它支持 Hash/B-tree 索引类型。安全

锁级别为行锁,行锁优势是适用于高并发的频繁表修改,高并发是性能优于 MyISAM。缺点是系统消耗较大,索引不只缓存自身,也缓存数据,相比 MyISAM 须要更大的内存。并发

InnoDB 中不保存表的具体行数,也就是说,执行 select count(*) from table时,InnoDB 要扫描一遍整个表来计算有多少行。数据库设计

支持事务,支持外键。高并发

ACID 事务

A 事务的原子性(Atomicity):指一个事务要么所有执行,要么不执行。也就是说一个事务不可能只执行了一半就中止了。好比你从取款机取钱,这个事务能够分红两个步骤:1)划卡,2)出钱。不可能划了卡,而钱却没出来,这两步必须同时完成,要么就不完成。
C 事务的一致性(Consistency):指事务的运行并不改变数据库中数据的一致性。例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变。
I 独立性(Isolation):事务的独立性也有称做隔离性,是指两个以上的事务不会出现交错执行的状态。由于这样可能会致使数据不一致。
D 持久性(Durability):事务的持久性是指事务执行成功之后,该事务所对数据库所做的更改即是持久的保存在数据库之中,不会平白无故的回滚。性能

Memory

Memory 是内存级别存储引擎,数据存储在内存中,因此他可以存储的数据量较小。

由于内存的特性,存储引擎对数据的一致性支持较差。锁级别为表锁,不支持事务。但访问速度很是快,而且默认使用 hash 索引。

Memory存储引擎使用存在内存中的内容来建立表,每一个Memory表只实际对应一个磁盘文件,在磁盘中表现为.frm文件。

总结

MyISAM InnoDB
存储结构 每张表被存放在三个文件:frm-格定义MYD(MYData)-数据文件MYI(MYIndex)-索引文件 全部的表都保存在同一个数据文件中(也多是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操做系统文件的大小,通常为2GB
存储空间 MyISAM可被压缩,存储空间较小 InnoDB的表须要更多的内存和存储,它会在主内存中创建其专用的缓冲池用于高速缓冲数据和索引
可移植性、备份及恢复 因为MyISAM的数据是以文件的形式存储,因此在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操做 免费的方案能够是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了
事务安全 不支持 每次查询具备原子性 支持 具备事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表
AUTO_INCREMENT MyISAM表能够和其余字段一块儿创建联合索引 InnoDB中必须包含只有该字段的索引
SELECT MyISAM更优
INSERT InnoDB更优
UPDATE InnoDB更优
DELETE InnoDB更优 它不会从新创建表,而是一行一行的删除
COUNT without WHERE MyISAM更优。由于MyISAM保存了表的具体行数 InnoDB没有保存表的具体行数,须要逐行扫描统计,就很慢了
COUNT with WHERE 同样 同样,InnoDB也会锁表
只支持表锁 支持表锁、行锁 行锁大幅度提升了多用户并发操做的新能。可是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的
外键 不支持 支持
FULLTEXT全文索引 支持 不支持(5.6.4以上支持英文全文索引) 能够经过使用Sphinx从InnoDB中得到全文索引,会慢一点

互联网项目中随着硬件成本的下降及缓存、中间件的应用,通常咱们选择都以 InnoDB 存储引擎为主,不多再去选择 MyISAM 了。而业务真发展的必定程度时,自带的存储引擎没法知足时,这时公司应该是有实力去自主研发知足本身需求的存储引擎或者购买商用的存储引擎了。

相关文章
相关标签/搜索