一、主要存储引擎


5.5以后的版本,默认存储引擎从myisam改成了innodb;线上推荐都用innodb

二、innodb存储引擎

(一)结构


INNODB存储引擎大致分三部分,图中已经(1)(2)(3)标出。至于MYSQL Server层暂不管它,就是SQL接口、解析器、优化器、缓冲池的那层组件。
上图中:
(1)是缓存层,由一个大的innodb buffer pool和很多个其他小的内存组件组成,用来缓冲数据的,innodb的数据读取写入不是直接操作文件,而是从文件加载到缓存,在缓冲里做操作,再flush到磁盘文件‘;
(2)是各种后台线程,例如IO线程、日志线程、监控线程等;
(3)是各种数据文件层,例如innodb的数据文件、redo log等;

(二)innodb的特点

1、innodb支持事务,事务ACID特性完整支持:
(1)原子性(A):通过回滚段失败回滚来保证原子性,也就是unlog log日志回滚保证原子性;
(2)一致性(C):通过支持主外键来保证一致性;
(3)隔离性(I):通过事务版本+回滚段=MVCC(多版本并发),也即是通过MVCC(多版本并发)机制来保证隔离性;
(4)持久性(D):通过事务日志(redo log)来保证持久性;

(三)事务隔离级别

1、支持四种不同的事务隔离级别,默认的事务隔离级别是REPEATABLE-READ(可重复读):

(四)INNODB存储引擎的锁

1、支持行级锁,写不阻塞读;不同行间的写相互不阻塞;并发性能好
2、行锁是加在索引上的(或者说行级锁是在索引上实现的),如果更新字段上没有索引则行锁会转换为表级锁。

(五)INNODDB数据块缓存池

1、数据的读写需要经过缓存(数据的读写不是直接读写磁盘文件,而是先将文件数据加载到内存,再进行读写(更新后产生脏页),再根据配置的策略定期将脏页刷新到磁盘)
2、innodb的数据是以整页(page,16K)为单位,读取到缓存中;
3、缓存中的数据以LRU策略换出;
4、IO效率高

(六)INNODB数据文件存储结构

1、innodb存储类型的表,是索引组织表(聚簇表),它的整个表数据就是一个索引表。表数据是根据主键排序,如果没有索引则检查唯一索引键,用唯一键做索引;如果没有主键也没有唯一索引键,则会自动内部分配一个rowID来做索引。
2、innodb结构的表是索引结构的,数据节点每页是16K。
3、innodb结构的表是索引组织表(聚簇表),根据主键寻址速度很快。
主键值递增的insert插入效率较好,主键随机insert插入操作效率差。因此,innodb表必须制定主键,建议使用自增数字。

(七)INNODB数据持久化与事务日志

1、事务日志(redo log)实时持久化,
2、内存变化数据(脏数据)增量异步刷出到磁盘文件;
3、实例故障靠重放日志恢复;
4、性能好,可靠,恢复快

二、MYISAM存储引擎

(一)特点

1、前身叫ISAM存储引擎;
2、MYISAM存储引擎的数据组织形式是一种堆表,和索引组织表相区别(innodb的数据组织形式是索引组织表)。
例如插入一条数据id=2(id为主键,表里已经存在id=1和id=3数据),
(1)myisam存储引擎:如果插入id=2,数据的插入位置和id=1 id=3无关系,也就是无序的;
堆表的插入特性是无序的,其他的数据库例如oracle PostgreSQL都是以堆表形式插入数据的;
(2)INNODB存储引擎:如果插入id=2,会插入到id=1和id=3之间,因为innodb是索引组织表是有有序的;
索引组织表的最大特点是根据主键去查询效率非常快。
3、MYISAM存储引擎不支持事务;
4、myisam存储引擎的缓存()不缓存数据,只缓存索引。数据缓存是交给操作系统的内存来缓存的。
这种会有问题:如果查询一个大表,会消耗大量操作系统内存,如果表中碎片很大可能会浪费大量操作系统内存。
5、锁粒度较大:使用的是读写锁(读的时候不允许写,写的时候不允许读,只有读的时候允许读)
6、数据文件可以直接 拷贝,偶尔可能会用上。但是线上现在不建议使用该引擎了
因为:
a、不支持事务;
b、锁粒度太大并发性能差;
c、只缓存索引不缓存数据,对系统内存影响较大有风险;
d、8.0取消了MYISAM引擎;

三、MEMORY存储引擎

1、数据全内存存放,无法持久化;
2、性能较高;
3、不支持事务;
4、适合偶尔作为临时表使用;
create tmpporary table tmp(…)

四、BLACLHOLD存储引擎

1、数据不作任何存储;
2、利用mysql replicate,充当日志服务器,在mysql replicate环境里充当代理主。

一般用BLACKHOLD作为日志服务器,记录数据库的所有变更。向其他从服务器分发日志。

五、TOKUDB存储引擎

1、分形树存储结构;
2、支持事务;
3、行锁;
4、压缩效率较高;
5、适合大批量insert的场景(吞吐量/io效率高)
6、备份比较麻烦,只有企业版有在线备份工具,社区版没有在线备份工具;

六、MYSQL CLUSTER

1、多主分布式集群;
2、数据节点间冗余,高可用;
3、支持事务;
4、设计上易于扩展;
5、面向未来,线上慎用;

20160924-1——mysql存储引擎的更多相关文章

  1. Mysql存储引擎及选择方法

    0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...

  2. Mysql存储引擎比较

    Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...

  3. MySQL存储引擎之Myisam和Innodb总结性梳理

    Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...

  4. MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述

    MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...

  5. 【转】mysql存储引擎

    http://www.cnblogs.com/kevingrace/p/5685355.html Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM In ...

  6. Mroonga 3.0.8 发布,MySQL 存储引擎

    Mroonga 3.0.8 支持 REPAIR TABLE 支持损坏的 groonga 数据库. Mroonga 是一个 MySQL 存储引擎,基于 Groonga,提供完整的全文搜索引擎.

  7. Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  8. 第 3 章 MySQL 存储引擎简介

    第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...

  9. MySQL存储引擎总结

    MySQL存储引擎总结 作者:果冻想 字体:[增加 减小] 类型:转载   这篇文章主要介绍了MySQL存储引擎总结,本文讲解了什么是存储引擎.MyISAM.InnoDB.MEMORY.MERGE等内 ...

  10. Mysql存储引擎__笔记

    Mysql存储引擎(表类型): Mysql数据库: 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以使存储器上一些文件的集合或者一些内存 数据的内存数据的集合. Mysql数据库是开放源代 ...

随机推荐

  1. 由"永恒之蓝"病毒而来的电脑知识科普

    永恒之蓝病毒事件: 继英国医院被攻击,随后在刚刚过去的5月12日晚上20点左右肆虐中国高校的WannaCry勒索事件,全国各地的高校学生纷纷反映,自己的电脑遭到病毒的攻击,文档被加密,壁纸遭到篡改,并 ...

  2. Android Framework 分析---2消息机制Native层

    在Android的消息机制中.不仅提供了供Application 开发使用的java的消息循环.事实上java的机制终于还是靠native来实现的.在native不仅提供一套消息传递和处理的机制,还提 ...

  3. SpringCloud系列十二:手动创建Feign

    1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...

  4. Redis之SkipList数据结构

    0.前言 Redis中有序集合zset需要使用skiplist作为存储数据结构, 关于skiplist数据结构描述可以查询wiki, 本文主要介绍Redis实现的skiplist的细节. 1.数据结构 ...

  5. Atitit.收银系统pos 以及打印功能的行业标准

    Atitit.收银系统pos 以及打印功能的行业标准 1. ESC指令序列 Escape指令序列不同于ESC/POS指令 1 2. 打印标准OPOS POSPrinter 与 CashDrawer 驱 ...

  6. 如何将webbrowser控件的Cookie倒入CookieContainer供WebRequest使用

    先建一个 "CookieContainer "   把WebBrowser中的Cookie保存在里面                       //在WebBrowser中登录 ...

  7. C语言变长參数的认识以及宏实现

    1.认识 变长參数是C语言的特殊參数形式.比如例如以下函数声明: int printf(const char *format, ....); 如此的声明表明,printf函数除了第一个參数类型为con ...

  8. mybatis 使用注解实现多参数传递

    若映射器中的方法只有一个参数,则在对应的SQL语句中,可以采用#{参数名}的方式来引用此参数,以前的例子多属于此类.但这种方法却不适用于需要传递多个参数的情况,今天就来介绍如何使用注解传递多个参数 一 ...

  9. 如何在Linux下统计高速网络中的流量

    参考: http://www.geekfan.net/5558/ http://blog.jobbole.com/23638/ http://www.csdn.net/article/2014-03- ...

  10. Python内置函数之all()

    all()函数返回值不是True就是False. 它只能传入一个参数,而且参数必须是可迭代对象,换句话说,参数不是元组就是列表(通常情况下). all()中的可迭代对象所有元素值为True或者不包含元 ...