纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Mysql存储引擎 Mysql中存储引擎的区别及比较

zgrgfr   2021-06-04 我要评论
想了解Mysql中存储引擎的区别及比较的相关内容吗zgrgfr在本文为您仔细讲解Mysql存储引擎的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Mysql,存储引擎,引擎的区别下面大家一起来学习吧

MyISAM存储引擎

MyISAM基于ISAM存储引擎并对其进行扩展它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一MyISAM拥有较高的插入、查询速度但不支持事务

MyISAM主要特性有:

1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持

2、当把删除和更新及插入操作混合使用的时候动态尺寸的行产生更少碎片这要通过合并相邻被删除的块以及若下一个块被删除就扩展到下一块自动完成

3、每个MyISAM表最大索引数是64这可以通过重新编译来改变每个索引最大的列数是16

4、NULL被允许在索引的列中这个值占每个键的0~1个字节

5、可以把数据文件和索引文件放在不同目录(InnoDB是放在一个目录里面的)

MyISAM引擎使用B+Tree作为索引结构叶节点的data域存放的是数据记录的地址

下图是MyISAM索引的原理图:

MyISAM索引的原理图

这里设表一共有三列假设我们以Col1为主键则上图是一个MyISAM表的主索引(Primary key)示意

可以看出MyISAM的索引文件仅仅保存数据记录的地址

在MyISAM中主索引和辅助索引(Secondary key)在结构上没有任何区别只是主索引要求key是唯一的而辅助索引的key可以重复

如果我们在Col2上建立一个辅助索引则此索引的结构如下图所示:

辅助索引的原理图

同样也是一颗B+Treedata域保存数据记录的地址

因此MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引如果指定的Key存在则取出其data域的值然后以data域的值为地址读取相应数据记录

MyISAM的索引方式也叫做“非聚集”的之所以这么称呼是为了与InnoDB的聚集索引区分

InnoDB存储引擎

InnoDB是事务型数据库的首选引擎支持事务安全表(ACID)支持行锁定外键上图也看到了InnoDB是默认的MySQL引擎

InnoDB主要特性有:

1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读这些功能增加了多用户部署和性能在SQL查询中可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来甚至在同一个查询中也可以混合

2、InnoDB是为处理巨大数据量的最大性能设计它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的

3、InnoDB存储引擎完全与MySQL服务器整合InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池InnoDB将它的表和索引在一个逻辑表空间中表空间可以包含数个文件(或原始磁盘文件)这与MyISAM表不同比如在MyISAM表中每个表被存放在分离的文件中InnoDB表可以是任何尺寸即使在文件尺寸被限制为2GB的操作系统上

4、InnoDB支持外键完整性约束存储表中的数据时每张表的存储都按主键顺序存放如果没有显示在表定义时指定主键InnoDB会为每一行生成一个6字节的ROWID并以此作为主键

虽然InnoDB也使用B+Tree作为索引结构但具体实现方式却与MyISAM截然不同

第一个重大区别是InnoDB的数据文件本身就是索引文件

从 上文知道MyISAM索引文件和数据文件是分离的索引文件仅保存数据记录的地址

而在InnoDB中表数据文件本身就是按B+Tree组织的一个索 引结构这棵树的叶节点data域保存了完整的数据记录

这个索引的key是数据表的主键因此InnoDB表数据文件本身就是主索引

InnoDB主索引

上图是InnoDB主索引(同时也是数据文件)的示意图可以看到叶节点包含了完整的数据记录

这种索引叫做聚集索引因为InnoDB的数据文件本身 要按主键聚集所以InnoDB要求表必须有主键(MyISAM可以没有)如果没有显式指定则MySQL系统会自动选择一个可以唯一标识数据记录的列 作为主键如果不存在这种列则MySQL自动为InnoDB表生成一个隐含字段作为主键这个字段长度为6个字节类型为长整形

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址换句话说InnoDB的所有辅助索引都引用主键作为data域

例如下图为定义在Col3上的一个辅助索引:

辅助索引

这里以英文字符的ASCII码作为比较准则聚集索引这种实现方式使得按主键的搜索十分高效但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键然后用主键到主索引中检索获得记录

了 解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助例如知道了InnoDB的索引实现后就很容易明白为什么不建议使用过长的字段作为 主键因为所有辅助索引都引用主索引过长的主索引会令辅助索引变得过大

再例如用非单调的字段作为主键在InnoDB中不是个好主意因为 InnoDB数据文件本身是一颗B+Tree非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整十分低效而使用 自增字段作为主键则是一个很好的选择

MEMORY存储引擎

MEMORY存储引擎将表中的数据存储到内存中未查询和引用其他表数据提供快速访问

MEMORY主要特性有:

1、MEMORY表的每个表可以有多达32个索引每个索引16列以及500字节的最大键长度

2、MEMORY存储引擎执行HASH和BTREE缩影

3、可以在一个MEMORY表中有非唯一键值

4、MEMORY表使用一个固定的记录长度格式

5、MEMORY不支持BLOB或TEXT列

6、MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引

7、MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)

8、MEMORY表内存被存储在内存中内存是MEMORY表和服务器在查询处理时的空闲中创建的内部表共享

9、当不再需要MEMORY表的内容时要释放被MEMORY表使用的内存应该执行DELETE FROM或TRUNCATE TABLE或者删除整个表(使用DROP TABLE)

Archive存储引擎 存储引擎的选择

不同的存储引擎都有各自的特点以适应不同的需求如下表所示:

InnoDB :如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力并要求实现并发控制InnoDB是一个好的选择

InnoDB 和 MyISAM之间的区别:

1>.InnoDB支持事物而MyISAM不支持事物

2>.InnoDB支持行级锁而MyISAM支持表级锁

3>.InnoDB支持MVCC, 而MyISAM不支持

4>.InnoDB支持外键而MyISAM不支持

5>.InnoDB不支持全文索引而MyISAM支持(X)

MyISAM:如果数据表主要用来插入和查询记录则MyISAM(但是不支持事务)引擎能提供较高的处理效率

Memory:如果只是临时存放数据数据量不大并且不需要较高的数据安全性可以选择将数据保存在内存中的Memory引擎MySQL中使用该引擎作为临时表存放查询的中间结果数据的处理速度很快但是安全性不高

Archive:如果只有INSERT和SELECT操作可以选择ArchiveArchive支持高并发的插入操作但是本身不是事务安全的Archive非常适合存储归档数据如记录日志信息可以使用Archive

使用哪一种引擎需要灵活选择一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求使用合适的存储引擎将会提高整个数据库的性能

以上为个人经验希望能给大家一个参考也希望大家多多支持


相关文章

猜您喜欢

  • C语言朴素模式匹配算法 C语言朴素模式匹配算法实例代码

    想了解C语言朴素模式匹配算法实例代码的相关内容吗bfhonor在本文为您仔细讲解C语言朴素模式匹配算法的相关知识和一些Code实例欢迎阅读和指正我们先划重点:朴素的模式匹配算法,字符串模式匹配算法C语言,c语言串的模式匹配算法下面大家一起来学习吧..
  • python 图片坐标裁剪 python四个坐标点对图片区域最小外接矩形进行裁剪

    想了解python四个坐标点对图片区域最小外接矩形进行裁剪的相关内容吗乱世流星01在本文为您仔细讲解python 图片坐标裁剪的相关知识和一些Code实例欢迎阅读和指正我们先划重点:python,图片坐标裁剪,python,图片裁剪,python最小外接矩形裁剪下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式