MySQL入门基础三-存储引擎详解

目录

一、存储引擎

二、MySQL  官方引擎概要介绍

InnoDB 存储引擎

MylSAM 存储引擎

Mrg_MylSAM

Archive 引擎

Blackhole 引擎

CSV 引擎

Federated 引擎

Memory  引擎

NDB 集群引擎

三、值得了解的第三方引擎

Percona 的 XtraDB 存储引擎

TokuDB 引擎

Infobright

其他

四、选择合适的引擎

五、表引擎的转换

ALTER TABLE

导出与导入

CREATE 和 SELECT

六、检查我的MySQL 的引擎

七、MyISAM 和InnoDB 比较


一、存储引擎

 从体系结构图中可以发现,MySQL 数据库区别于其他数据库的最重要的一个 特点就是其插件式的表存储引擎。MySQL 插件式的存储引擎架构提供了一系列标 准的管理和服务支持这些标准与存储引擎本身无关可能是每个数据库系统本 身都必需 SQL 分析器和优化器等而存储引擎是底层物理结构和实际文件 读写的实现每个存储引擎开发者可以按照自己的意愿来进行开发需要特别注 意的是存储引擎是基于表的而不是数据库

插件式存储引擎的好处是,每个存储引擎都有各自的特点够根据具体的 应用建立不同存储引擎表。由于 MySQL 数据库的开源特性用户可以根据 MySQL 定义的存储引擎接口编写自己的存储引擎若用户对某一种存储引擎的性能或 功能不满意可以通过修改源码来得到想要的特性这就是开源带给我们的方便 与力量

由于 MySQL 数据库开源特性,存储引擎可以分为 MySQL 官方存储引擎和第 三方存储引擎。有些第三方存储引擎很强大如大名鼎鼎的 InnoDB 存储引擎(最 早是第三方存储引擎,后被 Oracle 收购) ,其应用就极其广泛甚至是 MySQL  据库 OLTP(Online Transaction Processing 在线事务处理应用中使用最广泛的存储 引擎

二、MySQL  官方引擎概要介绍

InnoDB 存储引擎

InnoDB  MySQL 的默认事务型引擎也是最重要使用最广泛的存储引擎 它被设计用来处理大量的短期(short-lived)事务短期事务大部分情况是正常提交 很少会被回滚InnoDB 的性能和自动崩溃恢复特性使得它在非事务型存 储的需求中也很流行除非有非常特别的原因需要使用其他的存储引擎否则应 该优先考虑 InnoDB 引擎。如果要学习存储引InnoDB 也是一个非常好的值得

花最多的时间去深入学习的对象收益肯定比将时间平均花在每个存储引擎的学 习上要高得多。所以 InnoDB 引擎也将是我们学习的重点

MylSAM 存储引擎

 MySQL 5.1 及之前的版本MyISAM 是默认的存储引擎MyISAM 提供了 大量的特性包括全文索引压缩空间函数(GIS MyISAM 不支持事 务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复尽管 MyISAM 引擎不支持事务不支持崩溃后的安全恢复但它绝不是一无是处的对于只 的数据或者表比较小可以忍受修复(repair操作则依然可以继续使用 MyISAM (但请不要默认使用 MyISAM 而是应当默认使用 InnoDB) 但是 MyISAM 对整 张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对 表加排他锁。MyISAM 很容易因为表锁的问题导致典型的的性能问题

Mrg_MylSAM

Merge 存储引擎是一组 MyIsam 的组合也就是说他将 MyIsam 引擎的 多个表聚合起来但是他的内部没有数据真正的数据依然是 MyIsam 引擎的表 但是可以直接进行查询删除更新等操作

Archive 引擎

Archive 存储引擎只支持 INSERT SELECT 操作MySQL 5.1 之前也不支持 索引Archive 引擎会缓存所有的写并利用zlib 对插入的行进行压缩所以比   MyISAM 表的磁盘 I/O 更少。但是每次 SELECT 询都需要执行全表扫描所以 Archive 表适合日志和数据采集类应用这类应用做数据分析时往往需要全表扫 描。或者在一些需要更快速的 INSERT 操作的场合下也可以使用。Archive 引擎不 是一个事务型的引擎,而是一个针对高速插入和压缩做了优化的简单引擎

Blackhole 引擎

Blackhole 引擎没有实现任何的存储机制它会丢弃所有插入的数据不做 任何保存但是服务器会记录 Blackhole 表的日志所以可以用于复制数据到备 或者只是简单地记录到日志这种特殊的存储引擎可以在一些特殊的复制架 构和日志审核时发挥作用。但这种引擎在应用方式上有很多问题因此并不推荐

CSV 引擎

CSV 引擎可以将普通的 CSV 文件(逗号分割值的文件作为 MySQL  的表来处

但这种表不支持索引CSV 引擎可以在数据库运行时拷入或者拷出文件 以将 Excel 等的数据存储为 CSV 文件,然后复制到 MySQL 数据目录下就能在 MySQL  中打开使用同样如果将数据写入到一个 CSV 引擎表其他的外部程 序也能立即从表的数据文件中读取 CSV 格式的数据因此 CSV 引擎可以作为一 种数据交换的机非常有用

Federated 引擎

Federated 引擎是访问其他 MySQL 服务器的一个代理它会创建一个到远程 MySQL 服务器的客户端连接,并将查询传输到远程服务器执行然后提取或者发 送需要的数据。最初设计该存储引擎是为了和企业级数据库如 Microsoft SQL       Server  Oracle 的类似特性竞争的可以说更多的是一种市场行为尽管该引

擎看起来提供了一种很好的跨服务器的灵活性但也经常带来问题因此默认 禁用的

Memory  引擎

如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有 关系那么使用 Memory (以前也叫做 HEAP 是非常有用的Memory 表至 少比 MyISAM  表要快一个数量级,因为每个基于 MEMORY 存储引擎的表实际对 应一个磁盘文件。该文件的文件名与表名相同,类型为 frm 类型该文件中只存 储表的结构而其数据文件都是存储在内存中这样有利于数据的快速处理 提高整个表的效率不需要进行磁盘 I/O 所以 Memory 表的结构在重启以后还 保留但数据会丢失

Memroy 表在很多场景可以发挥好的作用:

用于查找(lookup或者映射(mapping例如将邮编和州名映射的表 用于缓存周期性聚合数据(periodically aggregated data)的结果

用于保存数据分析中产生的中间数据

Memory 表支持 Hash 索引,因此查找操作非常快。虽然 Memory 表的速度 非常快但还是无法取代传统的基于磁盘的表Memroy 表是表级锁因此并发 写入的性能较低。它不支持 BLOB  TEXT 型的列并且每行的长度是固定的 所以即使指定了 VARCHAR  实际存储时也会转换成 CHAR 这可能导致部分 内存的浪

NDB 集群引擎

使用 MySQL 服务器、NDB 集群存储引擎,以及分布式share-nothing   容灾的高可用的 NDB 数据库的组合被称为 MySQL 集群((MySQL Cluster)

三、值得了解的第三方引擎

Percona 的 XtraDB 存储引擎

基于 InnoDB 引擎的一个改进版本已经包含在 Percona Server  MariaDB  中,它的改进点主要集中在性能、可测量性和操作灵活性方面XtraDB 可以作为 InnoDB 的一个完全的替代产品,甚至可以兼容地读写 InnoDB 的数据文件并支  InnoDB 的所有查询

TokuDB 引擎

使用了一种新的叫做分形(Fractal Trees)的索引数据结构该结构是缓存无 关的因此即使其大小超过内存性能也不会下降也就没有内存生命周期和碎片 的问题TokuDB 是一种大数据(Big Data)存储引擎因为其拥有很高的压缩比 可以在很大的数据量上创建大量索引。现在该引擎也被 Percona 公司收购

Tips分形树,是一种写优化的磁盘索引数据结构  在一般情况下  分形 树的写操作(Insert/Update/Delete性能比较好同时它还能保证读操作近似于 B+树的读性能。据测试结果显示, TokuDB 分形树的写性能优于 InnoDB  B+ 读性能略低于 B+树。  形树核心思想是利用节点的 MessageBuffer 缓存更新操作,充分利用数据局部性原理,  将随机写转换为顺序写这样极大的提高了随机写的效率。

Infobright

MySQL 默认是面向行的每一行的数据是一起存储的服务器的查询也是以 行为单位处理的而在大数据量处理时面向列的方式可能效率更高比如 HBASE 就是面向列存储的

Infobright 是最有名的面向列的存储引擎在非常大的数据量(数十 TB) 该引擎工作良好Infobright 是为数据分析和数据仓库应用设计的数据高度压 按照块进行排序每个块都对应有一组元数据在处理查询时访问元数据 可决定跳过该块甚至可能只需要元数据即可满足查询的需求但该引擎不支持 索引不过在这么大的数据量级即使有索引也很难发挥作用而且块结构也 一种准索引 (quasi-index) Infobright 需要对 MySQL 服务器做定制因为一些地 需要修改以适应面向列存储的需要如果查询无法在存储层使用面向列的模式 执行则需要在服务器层转换成按行处理这个过程会很慢Infobright 有社区 版和商业版两个版本

其他

针对图操作,全文检索,MySQL 下都有对应的存储引擎大家可以自行查阅

四、选择合适的引擎

这么多存储引擎我们怎么选择?大部分情况下InnoDB 都是正确的选择 所以在 MySQL 5.5 版本将 InnoDB 作为默认的存储引擎了对于如何选择存储引 可以简单地归纳为一句话:“除非需要用到某些 InnoDB 不具备的特性并且 没有其他办法可以替代,否则都应该优先选择 InnoDB 擎” 比如MySQL  只有 MyISAM 支持地理空间搜索

当然,如果不需要用到 InnoDB 的特性,同时其他引擎的特性能够更好地满 足需求也可以考虑一下其他存储引擎举个例子如果不在乎可扩展能力和并 发能力也不在乎崩溃后的数据丢失问题却对 InnoDB 的空间占用过多比较敏 这种场合下选择 MyISAM 就比较合适

除非万不得已,否则建议不要混合使用多种存储引擎否则可能带来一系列 复杂的问题,以及一些潜在的 bug 和边界问题存储引擎层和服务器层的交互已 经比较复杂更不用说混合多个存储引擎了至少混合存储对一致性备份和服 务器参数配置都带来了一些困难

五、表引擎的转换

有很多种方法可以将表的存储引擎转换成另外一种引擎每种方法都有其优 点和缺点。常用的有三种方法

ALTER TABLE

将表从一个引擎修改为另一个引擎最简单的办法是使用 ALTER TABLE  语句 下面的语句将 mytable 的引擎修改为 InnoDB :

mysql> ALTER TABLE mytable ENGINE = InnoDB;

上述语法可以适用任何存储引擎但需要执行很长时在实现上MySQL 会按行将数据从原表复制到一张新的表中,在复制期间可能会消耗系统所有的  I/O 能力同时原表上会加上读锁所以在繁忙的表上执行此操作要特别小心

果转换表的存储引擎将会失去和原引擎相关的所有特性

导出与导入

还可以使用 mysqldump 工具将数据导出到文件然后修改文件中 CREATE    TABLE 语句的存储引擎选项注意同时修改表名因为同一个数据库中不能存在 相同的表名即使它们使用的是不同的存储引擎

CREATE 和 SELECT

先创建一个新的存储引擎的表,然后利用 INSERTSELECT 语法来导数据: 

mysql>CREATE TABLE innodb_table LIKE myisam_table;

mysql>ALTER TABLE innodb_table ENGINE=InnoDB;

mysql>INSERT INTO innodb_table SELECT * FROM myisam_table;

如果数据量很大,则可以考虑做分批处理,针对每一段数据执行事务提交操 作

六、检查我的MySQL 的引擎

1、查看当前 MySQL 支持的存储引擎

MariaDB [(none)]>  show engines;

 2、查看MySQL 当前默认的存储引擎

MariaDB [(none)]>  show variables like '%storage_engine%';

七、MyISAM 和InnoDB 比较

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王老狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值