MySQL存储引擎简要介绍

插件式存储引擎是MySQL的核心。MySQL每个存储引擎都有各自的特点,能够根据具体的应用建立不同的存储引擎表。以下将简要介绍InnoDB、MySQL、NDB、Memory、Archive、MyISAM Merge这6中存储引擎。
1、InnoDB
InnoDB作为第三方存储引擎,其应用极其广泛,甚至是MySQL数据库在OLTP应用中使用最广泛的。其特点是:行锁设计、支持外键、并支持类似Oracle的非锁定读(即默认情况下读取操作不会产生锁)。
这里简要描述一下OLTP和OLAP应用的区别,OLTP为联机事务处理(Online Transaction Processing),是传统关系型数据库的主要应用,主要是基本的、日常的事务处理;OLAP为联机分析处理(Online Analytical Processing),是数据仓库的核心部分,支持复杂的分析操作,侧重决策支持。
MySQL在windows版本下的默认存储引擎是InnoDB,同时InnoDB默认地被包含在所有的MySQL二进制发布版中。
具体而言,InnoDB具有以下特点:
(1)将数据放在一个逻辑的表空间,像黑盒一样由InnoDB自身进行管理。
(2)使用多版本并发控制MVCC来获得高并发性。(Multi-Version Concurrency Control 多版本并发控制,参考: http://www.cnblogs.com/perfectdesign/archive/2009/12/05/1617508.htmlhttp://blog.csdn.net/chen77716/article/details/6742128)
(3)实现了SQL标准的4种隔离级别(Isolation Level,参考:http://xm-king.iteye.com/blog/770721)。
3种现象:读脏数据Dirty Read、不可重复读Nonrepeatable Read、幻读Phantom Read
4种隔离级别:读未提交Read uncommitted、读已提交Read committed(select只能看到执行前这一瞬间前提交的修改)、可重复读Read repeatable(在开始事务时,给数据库拍个快照,然后该事务所有的操作都在这个快照上进行)、可串行化Serializable(利用next-key locking策略实现)
(4)插入缓存、二次写、自适应哈希索引、预读等
(5)聚集Clustered,每张表的存储都按照主键的顺序存放,如果没有显式地在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并依次作为主键
2、MyISAM
MyISAM是MySQL除windows版本外,所有MySQL版本默认的存储引擎。其特点是:不支持事务,表锁和全文索引。其根据数据表的特性可分为:
(1)静态MySQL:各数据列的长度都预先固定好。因为表中每一条记录所占空间都一样->存取和更新效率更高,数据受损时恢复较易。
(2)动态MySQL:数据表中出现varchar、xxxtext或xxxblob字段时。这种表存储空间比较小,但由于每条记录的长度不一,所以 多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降,且内存中也可能会出现很多碎片->经常用optimize table命令或优化工具来进行碎片整理。
(3)压缩MySQL:用myisamchk工具压缩,进一步减小了占用的存储->压缩之后不能修改,且表读取时先进行解压。
MyISAM存储引擎表:myd存放数据文件;myi存放索引文件。MySQL数据库只缓存其索引文件,数据文件的缓存由操作系统本身完成,这与Oracle不同(Oracle使用LRU即least recently used最近最少使用算法缓存数据)
3、NDB
NDB是一个集群存储引擎,采用Share noting集群架构。其特点是:数据全部放在内存中(5.1以上版本可将非索引数据放在磁盘上)->主键查找极快(primary key lookup);通过添加NDB数据的存储节点DataNode可线性提高数据库性能。
注:NDB存储引擎的连接操作JOIN是在MySQL数据库层完成的,而非存储引擎层。

下面我们将分别描述Share disk、Share Memory和Share nothing的区别(参考:http://blog.sina.com.cn/s/blog_7646b7a70100wjwg.html 或 http://tech.it168.com/a2012/0306/1321/000001321022_all.shtml)。


Share disk:每个CPU使用自己的私有内存区域,通过内部通讯机制(Interconnection Network)直接访问所有磁盘。磁盘系统由Interconnection Network连接在一起。
Share Memory:多个CPU共享同一片内存,CPU之间通过内部通讯机制(Interconnection Network)通讯。CPU之间通过主存进行通讯,具有很高的效率;但当更多的CPU被添加到主机上时,内存竞争contetion就成为瓶颈,CPU越多,瓶颈越厉害。
Share disk和Share Memory基本问题:Interference。当添加更多的CPU,系统反而减慢,因为增加了对内存访问Memory access和网络带宽network bandwidth的竞争。
Share nothing:每个CPU有自己的私有内存区域和磁盘空间,而且2个CPU不能访问相同磁盘空间,CPU之间的通讯采用网络连接->降低了竞争资源的等待时间,从而提高了性能。
Oracle的RAC->采用共享存储机制,对于I/O密集型的应用,瓶颈很容易落在存储上,这样的机制决定后续扩展只能是Scale Up想上扩展。
Sharding分片(Share Nothing架构)->是具体技术细节之上的抽象处理,是水平扩展的解决方案,其主要目的是为突破单点数据库服务器的I/O能力限制,解决数据库扩展性问题。应用场景:抽象出来的数据对象之间关联数据很小,如联机游戏、IM、BSP(Blog service provider)。(参考: http://dbanotes.net/database/database_sharding-2.html)
纵向扩展(Scale Up),即买更好的机器添加更多的资源来取得更好的性能(如硬件升级、更快更多的CPU、更大的内存、更多更大的磁盘等),而形式上采用的是并行数据库、分布式数据库的模式,具体细节依赖水平分区或者垂直分区的技术。
横向扩展(Scale Out),这种方式采用一些Ad-hoc的技术,比如说对数据库进行主从配置(Master-Slave)、采用数据库复制(Replication)技术以及服务器的缓存(Server Cache)等,来将负载分布到多个物理节点上去。

Sharding vs. Partition


Sharding分片->可跨越DB,跨越物理机器。
Partition分区->可跨越表空间,不同的物理属性,不可跨越DB。
集群的两大能力:
(1)负载均衡,包括读写负载均衡和读负载均衡。
(2)错误恢复:由于一个实体中的资源不能工作,另一实体中的资源透明的继续完成任务。
集群 vs. 分布式
集群->将几台服务器集中在一起,实现同一业务。例如Hadoop中的Map/Reduce
分布式->将不同业务分布在不同的地方。
4、Memory(Heap)
Memory将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据将消失->适用于临时数据的临时表及数据仓库中的纬度表,默认使用哈希索引。
限制:只支持表锁,并发性能差,并且不支持xxxtext和xxxblob列类型;存储变长字段varchar时是按照常字段char的方式进行->浪费内存。
MySQL数据库使用Memory存储引擎作为临时表来存放查询结果的中间集,如果中间结果集大于Memory存储引擎的容量设置,或中间集中包含xxxtext或xxxblob列类型字段,MySQL数据库会把其转换到MyISAM存储引擎。
5、Archive
Archive只支持insert和select操作(5.1以上开始支持索引),使用zlib算法将数据行压缩后存储(压缩率一般可达1:10)->适合归档数据,例如日志记录和聚合分析。
设计目标:提供高速的插入和压缩功能。
6、MyISAM Merge
MyISAM Merge是MyISAM的一个变种,合并表是将借个相同的MyISAM表合并成为一个虚表->常用于日志记录和数据仓库。

几种常用的MySQL存储引擎对比


几个问题:
(1)MySQL不支持全文索引?

不对,MySQL支持->MyISAM、Sphinx存储引擎支持
(2)MySQL不支持事务?
不对,MySQL支持->innodb支持
(3)表的数据量大于1000W时,MySQL性能会急剧下降?

不对,MySQL是数据库,不是文件,随着数据行数增加,性能当然会下降,但不是线性的->选择合适的存储引擎及正确的配置,再大的数据量MySQL也是能承受的。

参考:<MySQL技术内幕 InnoDB存储引擎>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值