1.InnoDB:数据和索引存放在单独的文件,聚簇索引,行级锁,事务,MVCC

2.MyISAM:

(1)缺点:不支持事务和表级锁,因为不支持表锁,锁颗粒比较大,因此适合只读和小文件。

(2)文件:数据文件和索引文件以.MYD和.MYI结尾。

(3)压缩表:压缩表不能修改,可以减少磁盘占用,也可以减少磁盘I/O;支持索引,所以只读;记录单独存放,要去单行不需要解压整个表。

3.memory:不需要进行磁盘I/O,查询速度非常快;使用的是表级锁,并发写入能力较低;系统中的临时表,就是使用memory。

4.Archive:

Archive引擎会缓存所有的写并利用zlib对插入的行进行压缩,所以比MylSAM表的磁 盘I/O更少。但是每次SELECT査询都需要执行全表扫描。所以Archive表适合日志和 数据釆集类应用,这类应用做数据分析时往往需要全表扫描。或者在一些需要更快速的 INSERT操作的场合下也可以使用。

(1)行级锁和专用缓冲区,所以支持高并发写入。

(2)只支持INSERT和SELECT,SELECT要进行全表扫描,而且只支持串查,当一个人查的时候会阻塞其他人的查询。

(3)会对所有写入的行进行压缩,所以磁盘I/O更少。

(4)适合日志和数据采集

在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录。

创建表时,MySQL会在数据库子目录下创建一个和表同名的.frm文件保存表的定义。

MySQL使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体的平台密切相关。

一、InnoDB存储引擎

InnoDB是MySQL的默认事务型引擎,也是最重要、最广泛的存储引擎。

它被设计用来处理大量的短期事务,短期事务大部分情况是正常提交的,很好会被回滚。

InnoDB的性能和自动恢复特性,使得它在非事务型存储的需求中也很流行。

除非有特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。

InnoDB的数据存储在表空间(tablespace)中,表空间是由InnoDB管理的一个黑盒子,由一些列的数据文件组成。

在MySQL4.1以后的版本中,InnoDB可以将每个表的数据和索引存放在单独的文件中。

InnoDB也可以使用裸设备作为表空间的存储介质,但现代的文件系统使得裸设备不再是必要的选择。

InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ(可重复读),并且通过间隙锁策略防止幻读的出现。

间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

InnoDB表是基于聚簇索引建立的。InnoDB的索引结构和MySQL的其他存储引擎有很大的不同,聚簇索引对主键查询有很高的性能。

不过它的二级索引(secondary index,非主键索引)中必须包含主键列,所以如果主键列很大的话,其他的所有索引都会很大。

因此,若表上的索引较多的话,主键应当尽可能的小。

InnoDB的存储格式是平台独立的,也就是说可以讲数据和索引文件从Intel平台复制到PowerPC 或者Sun SPARC平台。

InnoDB内部做了很多优化,包括从磁盘读取数据时采用的可预测性预读,能够自动在内存创建hash索引以加速读操作的自适应哈希索引,以及能够加速插入操作的插入缓冲区等。

二、MyISAM存储引擎

MylSAM引擎设计简单,数据以紧密格式存储,所以在某些场景下的性能很好。 MylSAM有一些服务器级别的性能扩展限制,比如对索引键缓冲区(key cache)的 Mutex锁,MariaDB基于段(segment)的索引键缓冲区机制来避免该问题。但MylSAM 最典型的性能问题还是表锁的问题,如果你发现所有的査询都长期处于“Locked”状态, 那么毫无疑问表锁就是罪魁祸首。

在MySQL5.1及之前的版本,MyISAM是默认的存储引擎。

MyISAM提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。

尽管MyISAM引擎不支持事务、不支持崩溃后的安全恢复,但它不是一无是处的。

对于只读的数据,或者表比较小、可以忍受修复操作,则依然可以继续使用MyISAM。

(1)存储

MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和.MYI为扩展名。

MyISAM表可以包含动态或者静态(长度固定)行。MySQL会根据表的定义来决定采用何种行格式。

MyISAM表可以存储的行记录数,一般受限于可用的磁盘空间,或者操作系统中单个文件的最大尺寸。

在MySQL5.0中,MyISAM表如果是变长行,则默认配置只处理256TB的数据,因为指向数据记录的指针长度是6个字节。

而在更早的版本中,指针长度默认是4个字节,所以只能处理4GB的数据。而所有的MySQL版本都支持8字节的指针。

要改变MyISAM表指针的长度(调高或者调低),可以通过修改表的MAX_ROWS和AVG_ROW_LENGTH选项的值来实现,两者相乘就是表可能达到的最大大小。

修改这两个参数会导致重建整个表和表的所有索引。

(2)特性

作为MySQL最早的存储引擎之一,MyISAM有一些已经开发出来很多年的特性,可以满足用户的实际需求。

加锁与并发

MyISAM对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对表加排他锁。

但是在表有读取查询的时候,也可以往表中插入新的记录。

修复

对于MyISAM表,MySQL可以手工或者自动执行检查和修复操作,但这里说的修复和事务恢复是不同的概念。

执行表的修复可能导致一些数据丢失,而且修复操作是非常慢的。可以通过CHECK TABLE mytable检查表的错误,如果有错误可以通过执行REPAIR TABLE mytable进行修复。

另外,如果MySQL服务器已经关闭,也可以通过myisamchk命令行工具进行检查和修复操作。

索引特性

对于MyISAM表,即使是BLOB和TEXT等长字段,也可以基于其前500个字符创建索引。

MyISAM也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的查询。

(3)MyISAM压缩表

如果表在创建并导入数据以后,不会再进行修改操作,那么这样的表或采用许适合MyISAM压缩表。

可以使用myisampack对MyISAM表进行压缩(也叫做pack)。压缩表是不能进行修改的(除非先将表解除压缩,修改数据,然后再次压缩)。

压缩表可以极大地减少磁盘空间占用,因此也可以减少磁盘I/O,从而提升查询性能。

压缩表也支持索引,但索引也是只读的。以现在的硬件能力,对大多数应用场景,读取压缩表数据时的解压带来的开销影响并不大,而减少I/O带来的好处则要大的多。

压缩时表中的记录是独立压缩的,所以读取单行的时候不需要去解压整个表(甚至也不解压行所在的整个页面)。

(4)MyISAM性能

MyISAM引擎设计简单,数据以紧密格式存储,所以在某些场景下的性能很好。

MyISAM有一些服务器级别的性能扩展限制,比如对索引键缓冲区(key cache)的Mutex锁,MariaDB基于段的索引键缓冲区机制来避免该问题。

但MyISAM最典型的性能问题还是表锁的问题,如果你发现所有的查询都长期处于“Locked”状态,那么毫无疑问表锁就是罪魁祸首。

三、memory引擎

如果需要快速的访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么使用Memory表是非常有用的。

Memory表至少比MyISAM表要快一个数量级,因为所有的数据都保存在内存中,不需要进行磁盘I/O。

Memory表的结构在重启以后还会保留,但数据会丢失。

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

(1)用于查找(lookup)或者映射(mapping)表

(2)用户缓存周期性聚合数据的结果

(3)用户保存数据分析中产生的中间数据

Memory表支持Hash索引,因此查询操作非常快。虽然Memory表的速度非常快,但还是无法取代传统的基于磁盘的表。

Memory表是表级锁,因此并发写入的性能较低。

它不支持BLOB或TEXT类型的列,并且每行的长度是固定的,所以即使指定了VARCHAR列,

实际存储时也会转化成CHAR,这可能会导致部分内存浪费。

如果MySQL在执行查询的过程中需要使用临时表来保存中间结果,内部使用的临时表就是Menory表。

如果中间结果大大超出了Memory表的限制,或者含有BLOB或者TEXT字段,则临时表会转换成MyISAM表。

四、NDB集群引擎

2003年,当时的MySQL AB公司从索尼爱立信公司收购了NDB数据库,然后开发了NDB集群存储引擎,作为SQL和NDB原生协议之间的接口。

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

五、CSV引擎

CSV引擎可以将普通的CSV文件(逗号分割值的文件)作为MySQL的表来处理,但这种表不支持索引。

CSV引擎可以在数据库运行时拷入或着拷出文件。

可以将Execl等电子表格如那件中的数据存储为CSV文件,然后复制到MySQL数据目录下,就能在MySQL中打开使用。

同样将数据写入到一个CSV引擎表,其他外部程序也能立即从表的数据文件中读取CSV格式的数据。

因此CSV引擎可以作为一种数据交换的机制,非常有用。

mysql> create table info(id int(4) not null ,name char(10) not null) engine = csv;
Query OK, 0 rows affected (0.12 sec)

mysql> insert into info values(1,‘科比’);
Query OK, 1 row affected (0.12 sec)

mysql> insert into info values(2,‘毛线’);
Query OK, 1 row affected (0.00 sec)

mysql> insert into info values(3,‘小鸟’);
Query OK, 1 row affected (0.00 sec)

效果:

六、Blackhole引擎

Black引擎没有实现任何的存储机制,它会丢弃所有插入的数据,不做任何保证。但是服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者只是简单的记录到日志。

这种特殊的存储引擎可以在一些特殊的复制架构和日志审核时发挥作用,但不推荐使用。

七、Archive

Archive存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前也不支持索引。

Archive引擎会缓存所有的写并利用zilb对插入的行进行压缩,所以比MyISAM表的磁盘I/O更少。

但是每次SELECT查询都需要进行全表扫描。所以ARchive表适合日志和数据采集类应用,这类应用做数据分析时往往需要全表扫面。或者在一些需要更快速的INSERT操作的场合下也可以使用。

ARchive引擎支持行级锁和专用的缓冲区,所以可以实现高并发的插入,在一个查询开始知道返回表中存在的所有行数之前,Archive引擎会阻止其他的SELECT执行,以实现一致性读。

另外,也实现了批量插入在完成之前对都操作是不可见的。这种操作模仿了事务和MVCC的一些特性,但Archive引擎不是一个事务型的引擎,而是一个插入和压缩做了优化的简单引擎。

欢迎工作一到五年的程序员朋友面对目前的技术无从下手,感到很迷茫,高清思维导图及相关视频资料获取方式加v:xiaoyanya_1里面有阿里Java高级大牛直播讲解知识点,分享知识,课程内容都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

MySQL的各大存储引擎相关推荐

  1. Mysql技术内幕——InnoDB存储引擎

    一.mysql体系结构和存储引擎 1.1.数据库和实例的区别 数据库:物理操作系统或其他形式文件类型的集合.在mysql下数据库文件可以是frm,myd,myi,ibd结尾的文件. 数据库实例:由数据 ...

  2. mysql 存储引擎 面试_搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

  3. MySQL内核:InnoDB存储引擎 卷1

    MySQL内核:InnoDB存储引擎卷1(MySQL领域Oracle ACE专家力作,众多MySQL Oracle ACE力捧,深入MySQL数据库内核源码分析,InnoDB内核开发与优化必备宝典) ...

  4. mysql 数据表操作 存储引擎介绍

    一 什么是存储引擎? 存储引擎就是表的类型. mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件有不同的类型,每种文件类型对应各自不同的处理机制 ...

  5. Mysql的两种存储引擎以及区别

    一.Mysql的两种存储引擎 1.MyISAM: ①不支持事务,但是整个操作是原子性的(事务具备四种特性:原子性.一致性.隔离性.持久性) ②不支持外键,支持表锁,每次所住的是整张表     MyIS ...

  6. mysql 参照完整性规则_MySQL存储引擎你们知道多少?

    MySQL存储引擎技术详解点击观看! MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的"存储引擎"(storage_engine)呢?有时候面试 ...

  7. 六、Mysql体系架构、存储引擎、临时表

    文章目录 Mysql体系架构 体系 连接层 SQL处理层 缓存 解析查询 优化 逻辑架构 物理存储结构 数据库 表文件 mysql utilities 安装 存储引擎 MyISAM 表压缩 适用场景: ...

  8. Java 培训 MySQL 体系构架、存储引擎和索引结构

    对某项技术进行系统性的学习,始终离不开对该项技术的整体认知.只有领略其全貌,方可将各块知识点更好的串联起来.为了进一步理解和学习 MySQL,我们有必要了解一下 MySQL 的体系构架.存储引擎和索引 ...

  9. MySQL的事务和存储引擎

    目录 一. MySQL事务 1.事务的概念 2.事务的ACID特点 2.1原子性 2.2一致性 2.3隔离性 2.4持久性 3. 事务之间的相互影响 4.MySQL事务隔离级别 4.1查询全局事务隔离 ...

最新文章

  1. Javascript学习7 - 脚本化浏览器窗口
  2. python提取个十百千位数字_实现人脸识别、人脸68个特征点提取,或许这个 Python 库能帮到你!...
  3. Spring ConfigurationClassPostProcessor Bean解析及自注册过程
  4. mfc 设置子窗口只打开一遍_MFC 判断子窗体是不是已经打开,避免重复创建
  5. mysql数据库 day02
  6. Java中的enum详细解析------Java 语言中 Enum 类型的使用介绍
  7. DiQuick Web UI 框架 V1.3.2 版本更新
  8. 谷歌云TPU上可以用Julia啦!0.23秒跑100张图片,Jeff Dean点赞推荐
  9. 安装TFS2010实际体验
  10. 检查Linux服务器性能的关键十条命令
  11. 剑指offer面试题58 - I. 翻转单词顺序(双指针)
  12. 拓端tecdat|R语言多元逐步回归模型分析房价和葡萄酒价格:选择最合适的预测变量
  13. php自定义按钮,vue实现自定义按钮的方法介绍(附代码)
  14. 不同VPC路由器通过静态路由、动态路由(OSPF)实现网络互通实战
  15. 史上最全Java项目实战课程(含项目实战+源码)
  16. 华景机器人百度_qq群机器人凉了,晨风创始人被抓,酷Q停止运营!
  17. android平板投影到电视,平板投屏到电视机如何操作可以互投
  18. 项目从.Net3.5转化到.Net4.0发生错误
  19. Learning Deep Similarity Models with Focus Ranking for Fabric Image Retrieval 学习笔记
  20. Java 入门-02-人机交互-图形化界面的小故事

热门文章

  1. Event ID: 7034 1000 解决经过
  2. 双11火了人工智能,未来到底选择什么工作,才不会被机器取代?!
  3. Linux命令之kill命令
  4. Oxygen XML Editor Enterprise主题引用的可能性
  5. Pytho基础 第三章
  6. python字符串,列表,元组,字典的基本操作
  7. 80老翁谈人生(38):火星存在地下文明有了新证据
  8. Tomcat修改内存大小方法
  9. python getitem方法理解_Python类中方法getitem和getattr详解
  10. jQuery阻止冒泡事件(单击事件执行了两次或多次)