前言

存储引擎其实就是如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。在Oracle和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎,用户可以根据不同的需求为数据表选择不同的存储引擎,也可以根据自己的需要编写存储引擎。

① 什么是MySQL存储引擎

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平,并且最终提供广泛的不同的功能和能力。通过选择不同的技术,能够获取额外的速度或者功能,从而改善应用的整体功能。

这些不同的技术以及配套的相关功能在MySQL中被称为存储引擎(也称作表类型)MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储信息、如何检索这些信息以及需要的数据结合什么性能和功能的时候,为其提供最大的灵活性。

② 查询mysql中支持的存储引擎

show engines;


查询结果中的 Engine 参数指的是存储引擎的名称; Support参数指的是MySQL是否支持该类引擎,YES表示支持;Comment 参数指对该引擎的评论。

从查询结果可以看出,MySQL支持多个存储引擎,其中InnoDB 为默认存储引擎。

MySQL支持很多类型的表,每种类型都有自己特定的作用、优点和缺点。MySQL还相应地提供了很多不同的存储引擎,可以以最适合于应用需求的方式存储数据。MySQL有多个可用的存储引擎,下面主要介绍InnoDB、MyISAM 和 MEMEORY三种存储引擎。

(一)InnoDB存储引擎

InnoDB 已经开发了十余年,遵循CNU通用公开许可(GPL)发行。InnoDB已经被一些重量级互联网公司所采用,如雅虎、Slashdot和Google,为用户操作非常大的数据库提供了一个强大的解决方案。InnoDB给MySQL的表提供了事务、回滚、崩溃修复能力和多版本并发控制的事务安全。MySQL从3.23.34a开始包含InnoDB存储引擎。InnoDB是MySQL上第一个提供外键约束的表引擎,而且InnoDB对事务处理的能力,也是MySQL其他存储引擎所无法比拟的。下面介绍InnoDB存储引擎的特点及缺点。

InnoDB存储引擎中支持自动增长列AUTO_INCREMENT。自动增长列的值不能为空,且值必须唯一。MySQL中规定自增列必须为主键。在插入值时,如果自动增长列不输入值,则插入的值为自动增长后的值;如果输入的值为0或空(NULL),则插入的值也为自动增长后的值;如果插入某个确定的值,且该值在前面没有出现过,则可以直接插入。

InnoDB存储引擎中支持外键 (FOREIGN KEY)。外键所在的表为子表,外键所依赖的表为父表。父表中被子表外键关联的字段必须为主键。当删除、更新父表的某条信息时,子表也必须有相应的改变。InnoDB存储引擎中,创建的表的表结构存储在.frm文件中。数据和索引存储在innodb_data_home_dirinnodb_data_file_path表空间中。

InnoDB存储引擎的优势在于提供了良好的事务管理、崩溃修复能力和并发控制。缺点是其读写效率稍差,占用的数据空间相对比较大。

InnoDB表是以下情况的理想引擎:

  • 更新密集的表: InnoDB存储引擎特别适合处理多重并发的更新请求。
  • 事务:InnoDB存储引擎是唯一支持事务的标准MySQL存储引擎,这是管理敏感数据
    (如金融信息和用户注册信息)的必需软件。
  • 自动灾难恢复:与其他存储引擎不同,InnoDB 表能够自动从灾难中恢复。虽然 MyISAM 表能在灾难后修复,但其过程要长得多。

Oracle的InnoDB存储引擎广泛应用于基于MySQL的Web、电子商务、金融系统、健康护理以及零售应用。因为InnoDB可提供高效的ACID独立性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)兼容事务处理能力,以及独特的高性能和具有可扩展性的构架要素。
另外,InnoDB设计用于事务处理应用,这些应用需要处理崩溃恢复、参照完整性、高级别的用户并发数,以及响应时间超时服务水平合同。在MySQL 5.5中,最显著的增强性能是将InnoDB作为默认的存储引擎。在MyISAM 以及其他表类型依然可用的情况下,用户无需更改配置,就可构建基于InnoDB的应用程序。

(二)MyISAM存储引擎

① MylSAM存储引擎的文件类型

  • MyISAM 存储引擎的表存储成3个文件。文件的名字与表名相同。扩展名包括frmMYDMYI
  • frm:存储表的结构;
  • myd:存储数据,是MYData的缩写;
  • myi:存储索引,是MYIndex的缩写。

② MyISAM存储引擎的存储格式

基于MyISAM存储引擎的表支持3种不同的存储格式,包括静态型、动态型和压缩型。
(1)静态型。如果所有表列的大小都是静态的(即不使用xBLOBxTEXTVARCHAR数据类型),MySQL就会自动使用静态MyISAM格式。使用这种类型的表性能非常高,因为在维护和访问以预定义格式存储的数据时需要很低的开销。但是,这项优点要以空间为代价,因为每列都需要分配给该列的最大空间,而无论该空间是否真正地使用。

(2)动态型。如果有表列(即使只有一列)定义为动态的(使用xBLOBxTEXTVARCHAR 数据类型),MySQL就会自动使用动态格式。虽然MyISAM动态表占用的空间比静态表所占空间少,但空间的节省带来了性能的下降。如果某个字段的内容发生改变,则其位置很可能就需要移动,这会导致碎片的产生。随着数据集中的碎片增加,数据访问性能就会相应降低。这个问题有两种修复方法:

  • 尽可能使用静态数据类型。
  • 经常使用OPTIMIZE TABLE语句,它会整理表的碎片,恢复由于表更新和删除而导致
    的空间丢失。

(3)压缩型。有时会创建在整个应用程序生命周期中都只读的表。如果是这种情况,就可以使用myisampack工具将其转换为MyISAM压缩表来减少空间。在给定硬件配置下(例如,快速的处理器和低速的硬盘驱动器),性能的提升将相当显著。

③ MylSAM存储引擎的优缺点

MyISAM存储引擎的优点在于占用空间小,处理速度快。缺点是不支持事务的完整性和并发性。

(三)MEMORY存储引擎

MEMORY存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。这些特性都与InnoDB存储引擎、MyISAM存储引擎不同。

① MEMORY存储引擎的文件存储形式

每个基于 MEMORY 存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm。该文件中只存储表的结构。而其数据文件,都是存储在内存中。这样有利于对数据的快速处理,提高整个表的处理效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要使用了,可以释放这些内容,甚至可以删除不需要的表。

② MEMORY存储引擎的索引类型

MEMORY存储引擎默认使用哈希(HASH)索引。其速度要比使用B型树(BTREE)索引快。如果希望使用B型树索引,可以在创建索引时选择使用。

③ MEMORY存储引擎的存储周期

MEMORY存储引擎通常很少用到。因为MEMORY表的所有数据是存储在内存上的,如果内存出现异常就会影响到数据的完整性。如果重启机器或者关机,表中的所有数据将消失。因此,基于MEMORY存储引擎的表生命周期很短,一般都是一次性的。

④ MEMORY存储引擎的优缺点

MEMORY表的大小是受到限制的。表的大小主要取决于两个参数,分别是max_rowsmax_heap_table_size。其中,max_rows可以在创建表时指定;max_heap_table_size的大小默认为16MB,可以按需要进行扩大。因为其存在于内存中的特性,所以这类表的处理速度非常快。但是,其数据易丢失,生命周期短。

创建MySQL MEMORY存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提高性能,但要记住,当mysqld守护进程崩溃时,所有的MEMORY数据都会丢失。

MEMORY表不支持VARCHARBLOBTEXT数据类型,因为这种表类型按固定长度的记录格式存储。此外,如果使用4.1.0之前的MySQL版本,则不支持自动增加列(通过AUTO_INCREMENT属性)。要记住,MEMORY表只用于特殊的范围,不会用于长期存储数据。基于这个缺陷,选择MEMORY存储引擎时要特别小心。

当数据有以下情况时,可以考虑使用MEMORY表:

  • 暂时:目标数据只是临时需要,在其生命周期中必须立即可用。
  • 相对无关:存储在MEMORY表中的数据如果突然丢失,不会对应用服务产生实质的负面影响,而且不会对数据完整性有长期影响。

MySQL4.1之后的版本同时支持散列索引和B树索引。B树索引优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。

(四)如何选择存储引擎

每种存储引擎都有各自的优势,不能笼统地说谁比谁更好,只有适合不适合。下面根据其不同的特性,给出选择存储引擎的建议。

InnoDB存储引擎:用于事务处理应用程序,具有众多特性,包括ACID事务支持、支持外键。同时支持崩溃修复能力和并发控制。如果对事务的完整性要求比较高,要求实现并发控制,那选择InnoDB存储引擎有很大的优势。需要频繁地进行更新、删除操作的数据库,也可以选择InnoDB存储引擎。因为,该类存储引擎可以实现事务的提交(Commit)和回滚(Rollback)。

MyISAM存储引擎:管理非事务表,它提供高速存储和检索,以及全文搜索能力。MyISAM存储引擎插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM存储引擎能实现处理的高效率。如果应用的完整性、并发性要求很低,也可以选择MyISAM存储引擎。

MEMORY存储引擎:MEMORY存储引擎提供“内存中”表,MEMORY存储引擎的所有数据都在内存中,数据的处理速度快,但安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMORY存储引擎。MEMORY存储引擎对表的大小有要求,不能建太大的表。所以,这类数据库只使用相对较小的数据库表。
以上存储引擎的选择建议是根据不同存储引擎的特点提出的,并不是绝对的。实际应用中还需要根据各自的实际情况进行分析。

MySQL最常用数据引擎(InnoDB、MylSAM、MEMORY)详解及如何选择合适的存储引擎相关推荐

  1. MySQL怎么选择合适的存储引擎

    以下内容摘抄与<深入浅出mysql> 在选择存储引擎时,应根据应用特点选择合适的存储引擎,对于复杂的应用系统可以根 据实际情况选择多种存储引擎进行组合. 下面是常用存储引擎的适用环境. M ...

  2. 史上最简单MySQL教程详解(进阶篇)之存储引擎介绍及默认引擎设置

    什么是存储引擎? MySQL存储引擎种类 MyISAM 引擎 InnoDB引擎 存储引擎操作 查看存储引擎 存储引擎的变更 修改默认引擎 什么是存储引擎? 与其他数据库例如Oracle 和SQL Se ...

  3. 适合mysql的网络存储_mysql 选择合适的存储引擎

    1 MyISAM:默认的MySQL 插件式存储引擎.如果应用是以读操作和插入操作为主, 只有很少的更新和删除操作,并且对事务的完整性.并发性要求不是很高,那么选择这个存 储引擎是非常适合的.MyISA ...

  4. MySQL中常用函数之日期函数使用详解

    关联博文: MySQL中日期时间类型与格式化 该篇总结MySQL 中常用的日期时间函数. [1]DATE_FORMAT (datetime ,FormatCodes ) 将日期转换成字符,示例如下: ...

  5. python获取mysql中的数据供js调用_详解js文件通过python访问数据库方法

    我来教你 js文件怎么通过python访问数据库,希望能够为你带来帮助. 1.如果是要提交表单内容给 服务器的 python 处理,那么只需要在表单 里面的 action 填写服务端的处理路由就可以了 ...

  6. mysql 存储引擎作用_MySQL常用存储引擎功能与用法详解

    MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB.BDB. 2. 非事务安全表:MyISAM.MEMORY.MERGE.EXAMPLE.NDB Cluster.ARCHIVE.CSV. ...

  7. mysql innodb 的锁机制_Mysql之Innodb锁机制详解

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.关于事务我们之前有专题介绍,这里就着重介绍下它的锁机制. 总的来说,InnoDB按照不同的分类共有 ...

  8. MySQL常用操作之创建存储过程语法详解

    MySQL常用操作之创建存储过程语法详解 前言 简介 语法 创建结构 变量结构 入参变量和出参变量 流程控制 判断(IF 语句) 判断(CASE 语句) 循环(LOOP 语句) 循环(WHILE 语句 ...

  9. ant如何形成时间轴和图库_Python数据可视化常用4大绘图库原理详解_python

    这篇文章主要介绍了Python数据可视化常用4大绘图库原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天我们就用一篇文章,带大家梳理mat ...

最新文章

  1. 1:tcl-8.5.13-8.el7.x86_64: [Errno 256] No more mirrors to try.
  2. 爬虫实战:嗅事百科段子多页爬取
  3. 【SPSS】SPSS第五周作业
  4. linux网络编程--阻塞与非阻塞
  5. php 不是有效的win32,%1不是有效的 win32应用程序(64位转换32位)
  6. coreos 安装mysql_如何执行CoreOS Linux的裸机安装
  7. 苹果地图副总裁_苹果地图表现糟糕 iOS副总裁福斯特难辞其咎
  8. Spring集合类型属性注入
  9. mysql插入记录到有约束的表_MySQL学习笔记-约束以及修改数据表
  10. IBM/ORACLE/EMC在银行业的重要性
  11. 18华工校赛 小马哥的超级盐水 折半枚举
  12. Android Apk反编译 dex2j遇到如下问题 com.googlecode.d2j.DexException: not support version.
  13. 谷歌浏览器下面的任务栏不见了
  14. html5有哪些内容,什么是html5?html5的优点有哪些?
  15. Windows socket之IOCP实例----IOCP开发驾照理论考试系统
  16. 先锋女性与Lazada:面包与玫瑰的东南亚之旅
  17. 《拆掉思维里的墙》简评和部分摘录
  18. 「实时视频流分析的边缘计算技术」最新2022研究综述
  19. 改oracle 密码,如何修改oracle用户密码
  20. 既生瑜何生亮,成发布会新宠的网红会干掉自媒体?!

热门文章

  1. 六、jQuery动画特效(一)
  2. 【转】宽带连接错误的处理办法691、623、678、645、720、721、718、734、769、619、676、815
  3. matlab的ctraj,一知半解|MATLAB机器人建模与仿真控制(6)
  4. 万字梳理!BERT之后,NLP预训练模型发展史
  5. 本人第一个完整Demo,加里奥类似。难点全部记录。2/1 未重做。
  6. 资深游戏3D建模师分享王者荣耀游戏角色制作技巧,入行月薪五位数真的不简单
  7. hyperf AOP面向切面编程
  8. 总会用到的系列3:成功的路上你可能需要一个微信公众号
  9. Oracle数据库插入平方(²)立方(³)等特殊字符
  10. 20162329张旭升 2016-2017-2 《程序设计与数据结构》第七周学习总结