MySQL存储引擎详解

来源:互联网 发布:数控编程什么软件好用 编辑:程序博客网 时间:2024/06/17 13:44

存储引擎的定义:MySQL可以将数据以不同的技术存储到文件(内存)中,这种技术就称为存储引擎。每一种存储引擎都有各自所不同的存储机制,索引技巧,锁定水平,最终提供广泛且不同的功能。

MySQL用到的存储引擎有多种,其中常见的有:MyISAM、InnoDB、Memory、Archive、CSV.

既然有多种存储引擎同时存在,那么它们肯定就是有各自的优势,各自有自己的应用场景,我们开发当中也是根据不同的需求来选择不同的存储引擎。再分析各自特点之前,延伸几个知识点。

一、并发控制:当多个连接对记录进行修改时保证数据的一致性和完整性。当处理并发读和并发写时,系统会有一套锁系统来处理这些业务。锁有以下两种

1.共享锁(读锁):在同一时间段内,多个用户可以读取同一个资源,读取过程数据不会发生变化;

2.排它锁(写锁):在任何时候,只能有一个用户写入资源,当进行写锁时,会阻塞其它读锁和写锁。

我们都知道加锁就意为着需要占用系统资源,会增大开销,那么锁到底锁哪里好呢,锁多大范围好呢?

为了在系统开销和保证数据安全之间取一个平衡,MySQL提供了两种锁颗粒:

1.表锁:是一种开销小的锁策略,因为一个表只能被一个锁占用;

2.行锁:是一种开销大的锁策略,而行锁则一个表中有多个锁,这样做的好处是可以支持大并发操作;

接下来延伸的第二个知识点就是事务:保证数据库的完整性。

例子:A转账给B 100元,则步骤(1)A账户金额减少100(A原始余额大于等于100),步骤(2)B账户金额增加100,这两个步骤是被当做一个整体来看待的,任何一个步骤出现问题,都会让状态恢复到原始状态。

事务有四大特性:ACID,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),这里只做简单介绍,详细的内容在之前所发的”Spring事务管理”博文中有讲解。

第三个延伸的知识点是外键:保证数据一致性的策略。

第四个延伸的知识点是索引:是对数据表中一列或多列的值进行排序的一种结构,以便于我们快速高效地找到我们所需数据,索引还可以引伸为普通索引、唯一索引、全文索引、B树索引、B+树索引、hash索引等。如:书的目录中记录各个知识点的页码,我们根据这个页码可以快速找到我们想要看的内容。

接下来就可以介绍我们这几种引擎的特点了,话不多说,上图:

以上就是各个存储引擎的特点,下面再来详细归纳一个各个引擎。

MyISAM:可以说是ISAM的变形,从设计之初就考虑到数据库被查询的次数要远大于更新的次数,因此MyISAM执行读取操作很快,比ISAM多了索引和字段管理等功能,使用表格锁定的机制来优化多个并发的读写操作。需要使用optimize table tableName来处理碎片,恢复由于表更新和删除操作所浪费的空间。MyISAM还有一些拓展,比如用MyISAMChk工具用来恢复数据库文件,和用MyISAMPack工具来恢复被更新锁浪费的空间,缺点是不提供事务的支持及外键,由于是写操作会锁住整个锁,所以效率也相对低一些,但是MyISAM中存储了表的行数,于是SELECT COUNT(*)FROM TABLE 就不需要权标扫描了,可以更快获得结果,MyISAM强调了快速读取操作,这也是为什么它如此受web应用开发欢迎的原因。适用于读多写少的情况。

Innodb:从MySQL5.5之后就是默认存储引擎,之前是MyISAM,Innodb提供了对数据库ACID事务支持,并且实现了四种隔离级别,提供了行级锁和外键约束,设计目标是处理大容量大并发的数据业务,由于锁的粒度更小,写操作不会锁定全表,所以处理高并发时,效率更高,但如果执行的SQL语句MySQL不能确定扫描范围,Innodb也会锁住整个表,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。Innodb还支持故障恢复,通过事务日志进行数据恢复。主键索引在Innodb引擎下也会更快。适用于处理大尺寸的数据集,及需要事务处理和主键索引的业务。

Archive:提供数据压缩功能,适合存储大量独立的,可做历史记录的数据或聚合分析的数据,插入效率高,但不支持索引,所以查询的性能相对差些。

Memory:通过在内存中创建临时表来存储数据,每张表对应一个磁盘文件,为.frm类型,磁盘文件存储结构,数据存储到内存中,具有极高的插入、更新、查询速度速度,Memory使用Hash和B树索引。

CSV:Comma-Separated Values(逗号分隔值),使用该引擎的MySQL数据表会在Mysql安装目录data文件夹中的数据库表目录中生成一个.CSV文件,所以它可以把CSV类型文件当做一个表来处理,这种文件是一个文本文件,每个数据行占用一个文本行,该类引擎不支持索引,不支持主键,不允许字段值为null.

BlackHole:该存储引擎支持事务锁,支持行锁,写入这种引擎锁中的数据都会消失,主要用于中继存储。

修改数据库引擎的方法:

1.通过修改MySQL配置文件实现,default-storage-engine = XXX

2.创建数据库表时就定义使用哪种storage-engine,具体语句:

Create Table tableName(

...

)ENGINE= XXX;

3.通过修改数据表命令实现:

ALTER TABLE tableName ENGINE = XXX;

实际MySQL存储引擎还不止以上几种,本文只列出比较常用的几种类型,欢迎讨论。



原创粉丝点击