数据库引擎对比InnerDB和MYISAM

 数据库存储引擎,是不同的存储技术将数据存储在文件或者内存当中,这些存储引擎当中每种都会使用不同的技术来进行数据的存储,索引技巧实现,或者说数据库锁的实现,通过这些不同的技巧来最终达到一定的效果。

   主要来看下我们比较经常使用的InnerDB

   InnerDB

       InnerDB是一个事务型的存储引擎,主要是目的是大数据时提供高性能的数据服务,在运行时在内存当中建立缓冲池,用来缓冲数据和索引。

InnerDB的特点:

1、支持事务处理、ACID事务特性

2、实现了SQL标准的四种隔离级别

3、支持行级锁和外键约束

4、可以利用事务日志进行数据恢复

5、不支持FullText类型的索引,没有保存数据库行数,计算count(*)需要全局扫描

6、支持自动增加列属性auto_increment

7、最后也是非常重要的一点:InnerDB是为了处理大量数据时的最大性能设计,其CPU效率可能是其他基于磁盘的关系型数据库所不能匹敌的。

在以下两点情况下必须使用InnerDB

1、可靠性高或者必须要求事务处理

2、表更新和查询相当的频繁,并且表锁定的机会比较大的情况下,指定InnerDB存储引擎。

InnerDB引擎的索引实现:

   InnerDB引擎的索引结构是B+树的实现方式。InnerDB的索引文件存储的包括数据文件,所以B+Tree树当中叶子节点中存储的就是实际数据,其实这种索引就是聚集索引。

   InnerDB的辅助索引存储域存储的也是记录相应主键的值不是地址,所以当使用辅助索引查找时,会先通过辅助索引找到主键,再根据主键索引找到实际的数据。InnerDB不建议使用过长的主键,否则会使辅助索引变得很大。

   因为InnerDB的数据本身要按照主键进行聚集,所以InnerDB必须要有主键,如果没有显示指定,InnerDB会自动选择可以唯一标识的列作为主键,如果不存在这样的列,InnerDB会隐式生成一个隐含字段,作为主键。

   InnerDB的辅助索引data域当中存储的值是主键的值而不是地址,InnerDB的辅助索引都是用主键作为data域。

   InnerDB引擎索引的查找步骤为:将主键组织到B+树上,行数据存储在B+树的叶子节点上,如果使用主键检索,会通过主键检索到叶子节点,然后获得行数据。如果对name进行检索,会在辅助索引B+树上检索name,找到其叶子节点,获得相应的主键,第二步使用主键在B+树当中再执行一次检索,最终到达叶子节点,获取整行数据。

MyISAM存储引擎

    MyISAM是Mysql的默认引擎,其目标是快速读取。

MyISAM引擎的特点:

1、快速读取,如果频繁插入和更新的话,因为涉及到数据全表锁,效率并不高

2、保存了数据库行数,执行count时,不需要扫描全表;

3、不支持数据库事务;

4、不支持行级锁和外键;

5、不支持故障恢复。

6、支持全文检索FullText,压缩索引。

MyISAM建议使用场景:

1、做很多count计算的,(如果count计算后面有where还是会全表扫描)

2、插入和更新较少,查询比较频繁的

      MyISAM引擎在创建表的时候,会创建三个文件,.frm文件,存储表的定义,.myd存储数据库数据,.myi存储数据索引。

     MyISAM的索引和数据是分开的,并且索引是有压缩的,所以存储文件就会小很多,MyISAM应对错误码导致的数据恢复的速度很快,MyISAM数据是以文件的形式保存的,所以在跨平台当中数据移动很方便,

MyISAM索引实现:

    MyISAM引擎当中的索引也是采用B+树的方式,MyISAM当中节点的键值指向的地址,地址当中存储的数据

    B+树当中存储的内容为实际数据的地址,也就是索引和数据的存储是分开的,即非聚集索引的一种实现方式。MyISAM引擎中根据索引的搜查方式是,根究给定的条件基于索引查找,找到叶子节点当中的数据地址,然后再根据数据地址查找到数据。

Mrg_MyISAM存储引擎

   Mrg_MyISAM是一种水平分表的一种方式,Mrg_MyISAM是一组MyISAM引擎的组合,将多个MyISAM引擎聚合起来,但是其内部没有数据,数据保存在MyISAM引擎对应的数据库当中,但是可以直接进行查询,删除更新操作。

   比如用户表,我们有上亿的用户,这个时候,对用户表进行水平切分,分成user1,user2,并且两张表结构完全相同,

//用户表一

CREATE TABLE IF NOT EXISTS `user1` ( 

`id` int(11) NOT NULL ,

`name` varchar(50) DEFAULT NULL, 

PRIMARY KEY (`id`) 

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ; 

//用户表二

CREATE TABLE IF NOT EXISTS `user2` ( 

`id` int(11) NOT NULL ,

`name` varchar(50) DEFAULT NULL, 

PRIMARY KEY (`id`) 

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ; 

//分别插入两条测试数据先

INSERT INTO `user1` (`name`) VALUES('辅助'); 

INSERT INTO `user2` (`name`) VALUES('JackFrost');

接下来我们创建一个Mrg_MyISAM存储引擎的数据表

CREATE TABLE IF NOT EXISTS `alluser` ( 

  `id` int(11) NOT NULL , 

  `name` varchar(50) DEFAULT NULL, 

  PRIMARY KEY (`id`)

) ENGINE=MRG_MYISAM 

DEFAULT CHARSET=utf8

UNION=(user1,user2)  ; 

在查询时,只需要查询主表,就可以把分表当中的数据查询出来,但是如果插入的时候,会提示插入失败,只有读权限,可以修改总表的method权限,来执行插入操作,同时也会指定插入主表时,插入的是具体哪个分表

ALTER TABLE `test_engine`.`alluser` INSERT_METHOD = FIRST;

也可以设置成插入总表的时候,插入到最后的一个分表当中

//就是插入总表的时候,其实也是插入到最后一个分表。

ALTER TABLE `test_engine`.`alluser` INSERT_METHOD = LAST;

在实际开发当中,我们需要有一个Mrg_MyISAM引擎的表来保存主键,然后我们根据路由策略来决定将数据保存到哪张表中。

Mrg_MyISAM使用场景:

1、适合插入和查询比较高的系统,有MyISAM是全表锁,所以不适合更新比较频繁的场景。

2、实际开发当中比较适合的就是日志管理,将不同月份的日志保存在不同的表当中,然后使用工具压缩,最后通过一张表查询初出来。

Mrg_MyISAM使用时收到的限制:

1、主表必须使用Mrg_MyISAM引擎,子表必须使用MyISAM引擎。可能就会有部分限制,比如不支持事务和外键

2、主表不能使用MyISAM的特性,比如全文索引,可以为子表创建FullText类型的索引,但是查询的话只能通过主表查询

3、如果修改主表的存储引擎,那么主表和子表的映射关系就丢失了,会将子表中的数据拷贝到修改后的表中

4、主表和字表的主键都不能自动增长

5、子表之间不能存在唯一键约束,但是单个子表内可以存在唯一键,所以通过主表可能查询到重复的id

Memory存储引擎

 Memory存储引擎采用逻辑介质是内存,因此其访问速度会非常快,其默认使用的是hash索引,一旦服务关掉,数据就会丢失。Memory存储引擎要求存储的数据是长度不变的格式,比如blob和text类型都不可以

适合的场景:

1、适合保存目标数据比较小,并且频繁进行访问的,如果太大的话,容易造成内存溢出,通过max_heap_table_size来设定表的大小;

2、存储在Memory引擎的表中的数据,如果丢失也没有关系的

3、如果数据是临时的,必须立刻用的到,那么可以存在内存当中。

   Memory存储引擎支持hash索引和B树索引,hash索引用来比较相等会比较快,范围查找会比较慢,B树索引可以部分查询和通配查询,也可以使用<,>,= 等方便数据挖掘。

  Memory存储引擎创建的表,最好是使用完之后,就删除。

以上就是关于常用的数据库引擎的记录,如有错误,欢迎指正~


参考:MySQL存储引擎InnoDB和MyISAM区别及使用场景

          MySQL优化系列(五)--数据库存储引擎(主要分析对比InnoDB和MyISAM以及讲述Mrg_Myisam分表)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容