有趣的 Mysql 存储引擎
Mysql 提供了一套统一的应用开发模型和核心 API,因此,尽管不同的存储引擎拥有不同的特性,不过对于开发人员,应用操作都是完全透明的。应用层的连接并不直接访问存储引擎层,而是访问 Mysql 提供的 Api,也就是说不管所操作的表对象使用什么存储引擎,读写数据时执行的 DDL/DML 语句并没有不同
下面介绍使用最广泛的存储引擎
memory 存储引擎
内存存储引擎,直接把表保存到内存中,在磁盘中只拥有一个 .frm 文件,用来存储表结构的定义
通过指定 engine=memory 设置
当 Mysql 服务关闭时,所有 memory 引擎表中的数据全部会丢失
分配给 memory 引擎表的内存,正常情况不会释放,而是有该表一直持有,即使删除数据,也不会被收回,只有当整个表被删除或者重建时才会回收相关内存
memory 引擎表占用多少内存空间?由两个因素决定
首先 memory 引擎表能使用的最大内存不能超过 max_heap_table_size 系统设置的值,该值默认情况下是 16MB (还可以在会话时,临时设置 max_heap_table_size 变量的值)
在创建时通过 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 倍
不足点:
目前 ARCHIVE 引擎仅能够支持 INSERT 和 SELECT 语句,而不能支持 DELETE、REPLACE、UPDATE 语句
不支持索引
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 选项有三个值
NO: 不允许插入,这也是默认值
FIRST 插入到第一个表
LAST 插入到最后一个表
MyISAN 存储引擎
如果没有指定表使用的存储引擎,那么创建表的默认存储引擎就是 MyISAN (5.5 以前)
使用 engine=myisam; 设置
默认会创建三个文件
frm 文件,用来存储表的对象结构
.MYD 文件,用来存储数据
.MYI 文件,用来存储索引
MyIASM 特性
最大存储能力为 256TB
支持 B-tree 索引
支持全文索引
支持索引缓存
支持数据压缩
支持复制
支持查询缓存
地理(三维)数据类型支持
地理数据索引支持
支持数据加密
支持统计信息
锁粒度到 table
支持备份/时间点恢复
MyISAN 不支持的
MVCC 不支持
clustered 索引不支持
hash 索引不支持
不支持事物
不支持数据缓存
不支持外健约束
不支持行级锁
MyISAM 主要优点是:查询快,写入快
MyISAM 支持三种存储格式:静态(FIXED)、动态(DYNAMIC)、压缩(COMPRESSED)
静态:
静态指的是,表不包含(varchar/varbinary/blob/text)
静态表会把以上字段类型会自动填充到达列的长度
较快,易于缓存
易于崩溃后重建
比动态表占用更多的磁盘空间
静态表,很容易可以到磁盘中的数据文件定位和查找记录,因为每一行记录都是固定的
动态:
包含(varchar/varbinary/blob/text)
除了字符串长度小于4的列外,其他字符串的长度都是动态的
比静态的更节约空间
压缩:
压缩表是只允许已读的,优点在于更节省空间,更快
InnoDB 存储引擎
mysql 5.5 之后。InnoDB 被认定为默认的存储引擎
InnoDB 有下列关键特性
设计遵循 ACID 模型,支持事物,拥有从服务崩溃中恢复的能力,能过最大限度的保护用户的数据
支持行级锁,并且引入了类型 Oracle 数据库中的一致性读特性,以提升多用户并发时的读写性能
InnoDB 引擎表组织数据时按照主键聚族,通过主键查找数据时性能极为优异
在维护数据完整性方面,InnoDB 支持外建约束
在服务器发生故障的情况下,Mysql 服务在启动时,会自动进行故障恢复
InnoDB 拥有自己的缓存池,常用的数据和索引都在缓存中
对于 INSERT,UPDATE,DELETE 操作,会被一种称为 change buffering 的机制自动优化
什么是 ACID ?
即事物的四个特性:原子性、一致性、隔离性、持久性
InnoDB 存储引擎的特点
存储能力 64TB
支持 MVCC
支持 B-tree 索引
支持 Clustered 索引
外建约束
查询缓存
索引缓存
数据缓存
事物
地理(三维)数据类型支持
数据加密
数据压缩
统计信息
支持行级锁
备份/时间点恢复
复制支持
不支持的功能
不支持 Hash 索引
不支持全文索引
地理数据索引支持
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 存储引擎的更多相关文章
- Mysql存储引擎及选择方法
0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...
- Mysql存储引擎比较
Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...
- MySQL存储引擎之Myisam和Innodb总结性梳理
Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
- 【转】mysql存储引擎
http://www.cnblogs.com/kevingrace/p/5685355.html Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM In ...
- Mroonga 3.0.8 发布,MySQL 存储引擎
Mroonga 3.0.8 支持 REPAIR TABLE 支持损坏的 groonga 数据库. Mroonga 是一个 MySQL 存储引擎,基于 Groonga,提供完整的全文搜索引擎.
- Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)
在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...
- 第 3 章 MySQL 存储引擎简介
第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...
- MySQL存储引擎总结
MySQL存储引擎总结 作者:果冻想 字体:[增加 减小] 类型:转载 这篇文章主要介绍了MySQL存储引擎总结,本文讲解了什么是存储引擎.MyISAM.InnoDB.MEMORY.MERGE等内 ...
随机推荐
- Python练习笔记——计算输入日期为改年的第几天、星期几
# 输入年月日,如:1995年12月10日,计算是该年的第几天?# 同时计算出当天是星期几? print("请依据提示依次输入您想查询的年 月 日") # 第一段代码块(年月日输入 ...
- socket概述和字节序、地址转换函数
一.什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信. socket API是一层抽象的网 ...
- Unix环境高级编程(十二)线程控制
本章介绍了一个进程中多个线程之间如何保持数据的似有性及进程的系统调用如何与线程进行交互. 1.线程限制: Single Unix定义了一线线程操作的限制,和其他的限制一样,可以通过sysconf来查询 ...
- Unix环境高级编程(十一)线程
一个进程在同一时刻只能做一件事情,线程可以把程序设计成在同一时刻能够做多件事情,每个线程处理各自独立的任务.线程包括了表示进程内执行环境必需的信息,包括进程中标识线程的线程ID.一组寄存器值.栈.调度 ...
- 以 DirectUI 方式实现的ImageButton
原文链接: http://www.cnblogs.com/hoodlum1980/archive/2011/02/15/1954779.html 这是一篇比较简单的文章,主要讲解的是用 DirectU ...
- 云从科技 OCR任务 pixel-anchor 方法
云从科技提出了一种端到端的深度学习文本检测框架Pixel-Anchor,通过特征共享的方式高效的把像素级别的图像语义分割和锚检测回归放入一个网络之中, 把像素分割结果转换为锚检测回归过程中的一种注意力 ...
- 程序员Git代码托管平台
程序员Git代码托管平台 说到Git代码托管平台,首先推荐的是GitHub,好多好的开源项目都来自GitHub,但是GitHub只能新建公开的Git仓库,私有 仓库要收费,如果你做的是一个开源项目,可 ...
- 安装ubuntu和windows双系统后,如何修改默认启动项
在安装了Ubuntu16.04系统之后,系统会默认自启动Ubuntu16.04,而我们大多数情况下可能都在使用windows系统,不修改默认设置,不经意间便会启动了Ubuntu16.04,通过我的经历 ...
- Android开发6——布局中的wrap_content和fill_parent以及match_parent
一.言简意赅 fill_parent 是让控件宽或者高占全屏 wrap_content是让控件的高或宽仅仅把控件里的内容包裹住而不是全屏 二.分别来看 1 fill_parent 设置一个构件的布局 ...
- e到底是什么?
e到底是什么? 今天看到一个下面这么一个简单的求极限问题- 一时恍惚了,为什么结果是e^m. 这个e是什么呢? 然后就百度了下,发现不少文章介绍这个e. 有几篇写得很赞 - An Intuitive ...