InnoDB存储引擎

该引擎是MySQL数据库的默认事务型引擎,它被设计用来处理大量短期事务(绝大多数正常提交,很少回滚)

InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成,在MySQL4.1之后的版本中,InnoDB可以将每个表的数据和索引存放在单独的文件中。InnoDB也可以使用裸设备作为表空间的存储介质(现在已无必要)。InnoDB采用MVCC来支持高并发,并实现了其中的四个隔离级别,默认级别为可重复读,并通过间隙锁策略来防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。InnoDB表是基于聚簇索引建立的,InnoDB的索引结构和MySQL的其他存储引擎有非常大的不同,聚簇索引对主键查询有非常高的性能。不过它的二级索引中必须包含主键列,所以如果主键列非常大的话,其他的索引都会很大。(表上的索引如果特别多的话,主键列应当尽可能的小)。InnoDB的数据存储格式是平台独立的。

InnoDB内部已经做了许多的优化,包括从磁盘读取数据时候采用的可预测性读,能够自动在内存中建立hash索引以加速读操作,加速插入操作的插入缓冲区等。作为事务型存储引擎,InnoDB通过一些机制和工具支持真正的热备份,MySQL的其他存储引擎不支持热备份。

MyISAM存储引擎

MySQL5.1及之前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS),但MyISAM不支持事务和行级锁,并且崩溃后无法安全恢复。

MyISAM会将表存储在两个文件中:数据文件(.MYD)和索引文件(.MYI)

MyISAM对整张表加锁,而不是针对行。读取时间会对需要读到的所有表加共享锁,写入时则对表加排它锁。但是在表有读取查询的同时,也可以往表中插入新的记录(并发插入)。对于MyISAM表,MySQL可以手工或者自动执行检查和修复操作。执行表的修复可能导致一些数据的丢失,而且修复速度是非常慢的。 对于MyISAM表,即使是BLOB和TEXT这种长字段,也可以基于前500个字符创建索引。创建MyISAM表的时候,如果指定了DELAY_KEY_WRITE选项,在每次修改执行完成时,不会立即写回到磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁盘。

如果表在创建并导入数据之后,不会再进行修改操作,那么这样的表或许适合采用MyISAM压缩表。压缩表是不能进行修改的(除非解压修改再压缩)。压缩表可以极大减少磁盘空间的占用,因此也可以减少磁盘I/O,从而提升查询性能。压缩表也同样支持索引,但索引也只能是只读的。

MyISAM引擎设计简单,数据以紧密格式存储,所以在某些场景下性能良好。MyISAM有一些服务器级别的性能扩展限制。

Archive引擎

该引擎只支持Insert和Select操作,Archive引擎会缓存所有的写并利用zlib对插入的数据进行压缩,所以比MyISAM表的磁盘I/O更少,但是每次Select都需要执行全表扫描。(适合数据采集以及日志)

Archive引擎支持行级锁和专用的缓冲区,可以实现高并发插入。

Blackhole引擎

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

CSV引擎

可以将普通的CSV文件作为MySQL的表来处理,但这种表不支持索引。CSV引擎可以在数据库运行时拷入或者拷出文件。CSV引擎作为一种数据交换的机制,非常有用。

Federated引擎

该引擎是访问其他MySQL服务器的一个代理,它会创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,然后提取或者发送需要的数据。

Memory引擎

如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没有关系,那么可以使用Memory表。所有的数据都可以存储在内存中,不需要进行磁盘I/O。Memory表的结构在重启以后还会保留,但是数据会丢失。

Memory表支持Hash索引,因此查找操作非常快。Memory是表级锁,因此并发写入的性能比较低,不支持BLOB或者TEXT类型的列,并且每一行的长度是固定的,因此可能导致内存浪费。

如果MySQL在执行查询的过程中需要使用临时表来存储中间结果,内部使用的临时表就是Memory表。如果中间结果太大超过了Memory表的限制,或者含有BLOB或者TEXT字段,则临时表会转换成MyISAM表。

Merge引擎

该引擎是MyISAM引擎的一个变种,由多个MyISAM表合并而来的虚拟表。

NDB集群引擎

MySQL集群使用的引擎。

选择合适的引擎

除非需要用到某些InnoDB不具备的特性,并且没有其他的办法可以替代,否则都应该优先选择InnoDB引擎。

事务 如果应用需要事务的支持,那么InnoDB是目前最好的选择,如果不需要事务,并且主要的是Insert和Select的话,那么MyISAM是不错的选择。

备份 如果可以定期地关闭服务器来执行备份,那么备份的因素可以忽略。反之,如果需要在线热备份,那么选择InnoDB就是基本的要求。

崩溃恢复 数据量比较大的时候,系统崩溃后如何快速地恢复是一个需要考虑的问题。

特有的特性 有些应用可能依赖一些存储引擎所独有的特性或者优化。

MySQL数据引擎的更多相关文章

  1. 修改mysql数据引擎的方法- 提高数据库性能

    前言:同学告我说,他为了能使得数据查询变得快一点,修改的数据引擎,故查询一下,总结一下. 登录mysql后,查看当前数据库支持的引擎和默认的数据库引擎,使用下面命令: mysql>show en ...

  2. mysql数据引擎的概念介绍

    什么是数据库引擎?每种数据库的数据格式,内部实现机制都是不同的,要利用一种开发工具访问一种数据库,就必须通过一种中介程序,这种开发工具与数据库之间的中介程序就叫数据库引擎. 如果你是个赛车手并且按一下 ...

  3. Mysql数据引擎和系统库

    系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MySQL ...

  4. MySQL数据引擎InnoDB和MyISAM互相转换

    MySQL(或者社区开源fork的MariaDB)5.5以上支持InnoDB引擎,并将其作为默认数据库引擎.InnoDB带来很多改进,但是对系统资源占用明显增加,对于还在128MB-512MB内存VP ...

  5. mysql 数据库引擎

    一.数据库引擎 数据库引擎是用于存储.处理和保护数据的核心服务.利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求. 使用数据库引擎创建用于联机事务处理或 ...

  6. MySQL数据库引擎类别和更换方式

    MySQL数据库引擎类别 能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEA ...

  7. MySql中启用InnoDB数据引擎的方法

    1.存储引擎是什么? Mysql中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...

  8. 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理

    重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...

  9. MySQL的数据引擎讲解

    一.MySQL的数据引擎讲解 在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM. 1.简单介绍这两种引擎,以及该如何去选择. a.Innodb引擎,Innodb引擎提供了对数据 ...

随机推荐

  1. 地址总线、数据总线、寻址能力、字长及cpu位数等概念之间的关系

    地址总线决定了CPU的寻址能力:数据总线的宽度与字长及CPU位数一致. 详细解释见下文: 1.地址总线与寻址能力 要存取数据或指令就要知道数据或指令存放的位置,地址寄存器存储的就是CPU当前要存取的数 ...

  2. python 学习源码练习(2)——简单文件读取

    #文件创建 #!/usr/bin/python3 'makeTextFile.py--create text file' import os ls = os.linesep #get filename ...

  3. Percona Toolkit 2.2.19 is now available

    New Features: 1221372: pt-online-schema-change now aborts with an error if the server is a slave, be ...

  4. 《JAVA程序设计与实例》记录与归纳--继承与多态

    继承与多态 概念贴士: 1. 继承,即是在已经存在的类的基础上再进行扩展,从而产生新的类.已经存在的类成为父类.超类和基类,而新产生的类成为子类或派生类. 2. Java继承是使用已存在的类的定义作为 ...

  5. Jquery_基础(二) 包装集

    包装集 <body> <div id="a01">1.包装集——length</div> <div id="a02"& ...

  6. Django---->视图(View)

    视图层之路由配置系统(views) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个 ...

  7. 开发高性能JAVA应用程序基础(集合篇)

    集合类在开发中使用非常频繁,使用时合理的选择对提高性能小有帮助.而且大部分面试都会有与集合相关的问题,例如ArrayList和LinkedList的对比. 了解API的集成与操作架构,才能了解何时该采 ...

  8. cs231n spring 2017 lecture4 Introduction to Neural Networks 听课笔记

    1. Backpropagation:沿着computational graph利用链式法则求导.每个神经元有两个输入x.y,一个输出z,好多层这种神经元连接起来,这时候已知∂L/∂z,可以求出∂L/ ...

  9. JavaSE(六)包装类、基本类型和字符串之间的转换、==和equals的区别

    一.包装类 Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足, 在设计类时为每个基本数据类型设计了一个对应的类进行代表,这 ...

  10. linux(二)之linux常用命令一

    linux的命令非常之多,命令多就算了关键每个命令还有很多的参数.不过其实并不要去害怕它.你只要常去用,并且的话,大部分你只要记住命令,参数不记得我们可以去查帮助文档.加油吧!老帖们. 一.登入\登出 ...