MySQL
数据库区别于其余数据库的很重要的一个特色就是其插件式的表存储引擎,其基于表,而不是数据库。因为每一个存储引擎都有其特色,所以咱们能够针对每一张表来挑选最合适的存储引擎。mysql
做为DBA
,咱们应该深入的认识存储引擎。今天介绍两种最多见的存储引擎和它们的区别:InnoDB
和MyISAM
。算法
InnoDB
存储引擎InnoDB
存储引擎支持事务,其设计目标主要就是面向OLTP(On Line Transaction Processing 在线事务处理)
的应用。特色为行锁设计、支持外键,并支持非锁定读。从5.5.8
版本开始,InnoDB
成为了MySQL
的默认存储引擎。sql
InnoDB
存储引擎采用汇集索引(clustered)的方式来存储数据,所以每一个表都是按照主键的顺序进行存放,若是没有指定主键,InnoDB
会为每行自动生成一个6
字节的ROWID
做为主键。数据库
MyISAM
存储引擎MyISAM
存储引擎不支持事务、表锁设计,支持全文索引,主要面向OLAP(On Line Analytical Processing 联机分析处理)
应用,适用于数据仓库等查询频繁的场景。在5.5.8
版本以前,MyISAM
是MySQL
的默认存储引擎。该引擎表明着对海量数据进行查询和分析的需求。它强调性能,所以在查询的执行速度比InnoDB
更快。segmentfault
MyISAM
存储引擎还有一个特色是只缓存索引文件,而不缓存数据文件,这点很是独特。缓存
InnoDB
和MyISAM
的区别为了数据库操做的原子性,咱们须要事务。保证一组操做要么都成功,要么都失败,好比转帐的功能。咱们一般将多条SQL
语句放在begin
和commit
之间,组成一个事务。安全
InnoDB
支持,MyISAM
不支持。并发
因为InnoDB
的汇集索引,其若是没有指定主键,就会自动生成主键。MyISAM
支持没有主键的表存在。性能
为了解决复杂逻辑的依赖,咱们须要外键。好比高考成绩的录入,必须归属于某位同窗,咱们就须要高考成绩数据库里有准考证号的外键。优化
InnoDB
支持,MyISAM
不支持。
为了优化查询的速度,进行排序和匹配查找,咱们须要索引。好比全部人的姓名从a-z
首字母进行顺序存储,当咱们查找zhangsan
或者第44
位的时候就能够很快的定位到咱们想要的位置进行查找。
InnoDB
是汇集索引,数据和主键的汇集索引绑定在一块儿,经过主键索引效率很高。若是经过其余列的辅助索引来进行查找,须要先查找到汇集索引,再查询到全部数据,须要两次查询。
MyISAM
是非汇集索引,数据文件是分离的,索引保存的是数据的指针。
从InnoDB 1.2.x
版本,MySQL5.6
版本后,二者都支持全文索引。
auto_increment
对于自增数的字段,InnoDB
要求必须有只有该字段的索引。但MyISAM
能够将该字段与其余字段组成联合索引。
很常见的需求是看表中有多少条数据,此时咱们须要select count(*) from table_name
。
InnoDB
不保存表行数,须要进行全表扫描。MyISAM
用一个变量保存,直接读取该值,更快。当时当带有where
查询的时候,二者同样。
数据库的文件都是须要在磁盘中进行存储,当应用须要时再读取到内存中。通常包含数据文件、索引文件。
InnoDB
分为:
.frm
表结构文件.ibdata1
共享表空间.ibd
表独占空间.redo
日志文件MyISAM
分为三个文件:
.frm
存储表定义.MYD
存储表数据.MYI
存储表索引若是你的操做是大量的查询操做,如SELECT
,使用MyISAM
性能会更好。
若是大部分是删除和更改的操做,使用InnoDB
。
delete
调用delete from table
时,MyISAM
会直接重建表,InnoDB
会一行一行的删除,可是能够用truncate table
代替。参考: mysql清空表数据的两种方式和区别。
MyISAM
仅支持表锁,每次操做锁定整张表。InnoDB
支持行锁,每次操做锁住最小数量的行数据。
表锁相比于行锁消耗的资源更少,且不会出现死锁,但同时并发性能差。行锁消耗更多的资源,速度较慢,且可能发生死锁,可是由于锁定的粒度小、数据少,并发性能好。若是InnoDB
的一条语句没法肯定要扫描的范围,也会锁定整张表。
当行锁发生死锁的时候,会计算每一个事务影响的行数,而后回滚行数较少的事务。
MyISAM
崩溃后没法快速的安全恢复。InnoDB
有一套完善的恢复机制。
MyISAM
仅缓存索引数据,经过索引查询数据。InnoDB
不只缓存索引数据,同时缓存数据信息,将数据按页读取到缓存池,按LRU(Latest Rare Use 最近最少使用)
算法来进行更新。
建立表的语句都是相同的,只有最后的type
来指定存储引擎。
MyISAM
count
InnoDB