Mysql 提供了一套统一的应用开发模型和核心 API,因此,尽管不同的存储引擎拥有不同的特性,不过对于开发人员,应用操作都是完全透明的。应用层的连接并不直接访问存储引擎层,而是访问 Mysql 提供的 Api,也就是说不管所操作的表对象使用什么存储引擎,读写数据时执行的 DDL/DML 语句并没有不同

下面介绍使用最广泛的存储引擎

memory 存储引擎

内存存储引擎,直接把表保存到内存中,在磁盘中只拥有一个 .frm 文件,用来存储表结构的定义

通过指定 engine=memory 设置

当 Mysql 服务关闭时,所有 memory 引擎表中的数据全部会丢失

分配给 memory 引擎表的内存,正常情况不会释放,而是有该表一直持有,即使删除数据,也不会被收回,只有当整个表被删除或者重建时才会回收相关内存

memory 引擎表占用多少内存空间?由两个因素决定

  1. 首先 memory 引擎表能使用的最大内存不能超过 max_heap_table_size 系统设置的值,该值默认情况下是 16MB (还可以在会话时,临时设置 max_heap_table_size 变量的值)

  2. 在创建时通过 CREATE TABLE 语句的 MAX_ROWS 选项,指定表中最大的记录数的方式来限制表能够使用的内存空间

CSV 存储引擎

CSV 存储引擎是基于 CSV 格式文件存储数据

通过指定 engine=csv 设置

CSV 存储引擎因为自身文件格式的原因,所有列必须强制指定 NOT NULL ,另外 CSV 引擎也不支持索引,不支持分区

CSV 存储引擎也会包含一个存储表结构的 .frm 文件,还会创建一个 .csv 存储数据的文件,还会创建一个同名的元信息文件,该文件的扩展名为 .CSM ,用来保存表的状态及表中保存的数据量

因为 csv 文件本身就可以直接被编辑,保不齐就有不按规则出牌的情况,如果出现csv 文件中的内容损坏了的情况,也可以使用 CHECK TABLE 或者 REPAIR TABLE 命令检查和修复

ARCHIVE 存储引擎

ARCHIVE 存储引擎适用场景恰如其名---归档,基于这个存储引擎,能够将大量数据压缩存储,插入的列会被压缩

使用了 zlib 无损数据压缩算法,并且还可以使用 OPTIMIZE TABLE 分析表并使其打包成更小的格式

相同的数据量,ARCHIVE 存储引擎 比 MyISAM 引擎小了近 8 倍

不足点:

  1. 目前 ARCHIVE 引擎仅能够支持 INSERT 和 SELECT 语句,而不能支持 DELETE、REPLACE、UPDATE 语句

  2. 不支持索引

ARCHIVE 引擎除了拥有 .frm 结构文件外,还有一个扩展名为 .arz 的数据文件

BLACKHOLE

黑洞存储引擎,所有插入的数据并不会保存,BLACKHOLE 引擎表永远保持为空

:) 我这里没想到什么适用场景,故不做太多介绍

MERGE 存储引擎

MERGE 存储引擎,也被称为 MGR_MyISAM 存储引擎,它实际上是将一组 MyISAM 表聚合在一起,使用时就和一张表一样

MERGE 存储引擎,要求聚合的表结构、索引要完全一致

使用 engine=merge union=(表名,表名) 创建

除了保存表结构定义的 .frm 文件外,还有一个扩展名为 .mgr 的文件,这个文件不保存数据,而是保存的数据来源地

MERGE 存储引擎出了支持 SELECT 之外,还支持 UPDATE、DELETE 语句

需要支持 insert 语句的话,需要配置 INSERT_METHOD 指定插入的记录保存到哪个表中

INSERT_METHOD 选项有三个值

  1. NO: 不允许插入,这也是默认值

  2. FIRST 插入到第一个表

  3. LAST 插入到最后一个表

MyISAN 存储引擎

如果没有指定表使用的存储引擎,那么创建表的默认存储引擎就是 MyISAN (5.5 以前)

使用 engine=myisam; 设置

默认会创建三个文件

  1. frm 文件,用来存储表的对象结构

  2. .MYD 文件,用来存储数据

  3. .MYI 文件,用来存储索引

MyIASM 特性

  1. 最大存储能力为 256TB

  2. 支持 B-tree 索引

  3. 支持全文索引

  4. 支持索引缓存

  5. 支持数据压缩

  6. 支持复制

  7. 支持查询缓存

  8. 地理(三维)数据类型支持

  9. 地理数据索引支持

  10. 支持数据加密

  11. 支持统计信息

  12. 锁粒度到 table

  13. 支持备份/时间点恢复

MyISAN 不支持的

  1. MVCC 不支持

  2. clustered 索引不支持

  3. hash 索引不支持

  4. 不支持事物

  5. 不支持数据缓存

  6. 不支持外健约束

  7. 不支持行级锁

MyISAM 主要优点是:查询快,写入快

MyISAM 支持三种存储格式:静态(FIXED)、动态(DYNAMIC)、压缩(COMPRESSED)
静态:

静态指的是,表不包含(varchar/varbinary/blob/text)

静态表会把以上字段类型会自动填充到达列的长度
较快,易于缓存
易于崩溃后重建
比动态表占用更多的磁盘空间 静态表,很容易可以到磁盘中的数据文件定位和查找记录,因为每一行记录都是固定的

动态:

包含(varchar/varbinary/blob/text)
除了字符串长度小于4的列外,其他字符串的长度都是动态的
比静态的更节约空间

压缩:

压缩表是只允许已读的,优点在于更节省空间,更快

InnoDB 存储引擎

mysql 5.5 之后。InnoDB 被认定为默认的存储引擎

InnoDB 有下列关键特性

  1. 设计遵循 ACID 模型,支持事物,拥有从服务崩溃中恢复的能力,能过最大限度的保护用户的数据

  2. 支持行级锁,并且引入了类型 Oracle 数据库中的一致性读特性,以提升多用户并发时的读写性能

  3. InnoDB 引擎表组织数据时按照主键聚族,通过主键查找数据时性能极为优异

  4. 在维护数据完整性方面,InnoDB 支持外建约束

  5. 在服务器发生故障的情况下,Mysql 服务在启动时,会自动进行故障恢复

  6. InnoDB 拥有自己的缓存池,常用的数据和索引都在缓存中

  7. 对于 INSERT,UPDATE,DELETE 操作,会被一种称为 change buffering 的机制自动优化

什么是 ACID ?

即事物的四个特性:原子性、一致性、隔离性、持久性

InnoDB 存储引擎的特点

  1. 存储能力 64TB

  2. 支持 MVCC

  3. 支持 B-tree 索引

  4. 支持 Clustered 索引

  5. 外建约束

  6. 查询缓存

  7. 索引缓存

  8. 数据缓存

  9. 事物

  10. 地理(三维)数据类型支持

  11. 数据加密

  12. 数据压缩

  13. 统计信息

  14. 支持行级锁

  15. 备份/时间点恢复

  16. 复制支持

不支持的功能

  1. 不支持 Hash 索引

  2. 不支持全文索引

  3. 地理数据索引支持

InnoDB 和 MyISAM 的区别

  • InnoDB不支持FULLTEXT类型的索引。

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

  • 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

  • DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

  • LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

  • 另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

  • 两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

有趣的 Mysql 存储引擎的更多相关文章

  1. Mysql存储引擎及选择方法

    0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...

  2. Mysql存储引擎比较

    Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...

  3. MySQL存储引擎之Myisam和Innodb总结性梳理

    Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...

  4. MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述

    MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...

  5. 【转】mysql存储引擎

    http://www.cnblogs.com/kevingrace/p/5685355.html Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM In ...

  6. Mroonga 3.0.8 发布,MySQL 存储引擎

    Mroonga 3.0.8 支持 REPAIR TABLE 支持损坏的 groonga 数据库. Mroonga 是一个 MySQL 存储引擎,基于 Groonga,提供完整的全文搜索引擎.

  7. Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  8. 第 3 章 MySQL 存储引擎简介

    第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...

  9. MySQL存储引擎总结

    MySQL存储引擎总结 作者:果冻想 字体:[增加 减小] 类型:转载   这篇文章主要介绍了MySQL存储引擎总结,本文讲解了什么是存储引擎.MyISAM.InnoDB.MEMORY.MERGE等内 ...

随机推荐

  1. windows下使用mongodb

    ********************************************************************* ERROR: dbpath (\data\db\) does ...

  2. Error parsing XML: not well-formed (invalid token) 报错

    鼠标右键选择Source然后再选Format 就可以解决此问题

  3. HDU 5092 DP

    DP水题 求从上到下走完,使所取得权值最小,并输出路径,若有多个满足,则输出靠右的 #include "stdio.h" #include "string.h" ...

  4. django中处理文件上传文件

    1 template模版文件uploadfile.html 特别注意的是,只有当request方法是POST,且发送request的<form>有属性enctype="multi ...

  5. Redis 实现队列优先级

    通常使用一个list来实现队列操作,这样有一个小限制,所以的任务统一都是先进先出,如果想优先处理某个任务就不太好处理了,这就需要让队列有优先级的概念,我们就可以优先处理高级别的任务. 实现方式: (1 ...

  6. redis实践:用户注册登录功能

    本节将使用PHP和Redis实现用户注册登录功能,下面分模块来介绍具体实现方法. 1.注册 需求描述:用户注册时需要提交邮箱.登录密码和昵称.其中邮箱是用户的唯一标识,每个用户的邮箱不能重复,但允许用 ...

  7. Redis(二十一):Redis性能问题排查解决手册(转)

    性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数 ...

  8. springmvc+spring+mybatis+maven项目构建

    1.首先在myeclipse10中安装maven的插件,将插件放入D:\Program Files (x86)\myEclipse10\MyEclipse Blue Edition 10\dropin ...

  9. Hypothesis Testing

    Hypothesis Testing What's Hypothesis Testing(假设检验) Hypothesis testing is the statistical assessment ...

  10. angular学习笔记(十)-src和href处理

    本篇主要介绍angular中图片的src和链接的href的处理: 用到了以下两个属性: ng-src: 绑定了数据的路径表达式 ng-href: 绑定了数据的路径表达式 例如: <!DOCTYP ...