MySQL数据引擎
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数据引擎的更多相关文章
- 修改mysql数据引擎的方法- 提高数据库性能
前言:同学告我说,他为了能使得数据查询变得快一点,修改的数据引擎,故查询一下,总结一下. 登录mysql后,查看当前数据库支持的引擎和默认的数据库引擎,使用下面命令: mysql>show en ...
- mysql数据引擎的概念介绍
什么是数据库引擎?每种数据库的数据格式,内部实现机制都是不同的,要利用一种开发工具访问一种数据库,就必须通过一种中介程序,这种开发工具与数据库之间的中介程序就叫数据库引擎. 如果你是个赛车手并且按一下 ...
- Mysql数据引擎和系统库
系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MySQL ...
- MySQL数据引擎InnoDB和MyISAM互相转换
MySQL(或者社区开源fork的MariaDB)5.5以上支持InnoDB引擎,并将其作为默认数据库引擎.InnoDB带来很多改进,但是对系统资源占用明显增加,对于还在128MB-512MB内存VP ...
- mysql 数据库引擎
一.数据库引擎 数据库引擎是用于存储.处理和保护数据的核心服务.利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求. 使用数据库引擎创建用于联机事务处理或 ...
- MySQL数据库引擎类别和更换方式
MySQL数据库引擎类别 能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEA ...
- MySql中启用InnoDB数据引擎的方法
1.存储引擎是什么? Mysql中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术, ...
- 重新学习MySQL数据库3:Mysql存储引擎与数据存储原理
重新学习Mysql数据库3:Mysql存储引擎与数据存储原理 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有 ...
- MySQL的数据引擎讲解
一.MySQL的数据引擎讲解 在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM. 1.简单介绍这两种引擎,以及该如何去选择. a.Innodb引擎,Innodb引擎提供了对数据 ...
随机推荐
- java面向对象知识整理(一)
1.面向对象思想 概述:面向对象是相对于面向过程而言的,面向过程强调的是功能,面向对象强调的是将功能封装进对像,强调具备功能的对象. 特点:(1)符合人们思考习惯的一种思想. (2)将复杂的事情简单化 ...
- Ant Design Pro 学习一 安装
安装: 直接 clone git 仓库 $ git clone --depth=1 https://github.com/ant-design/ant-design-pro.git my-projec ...
- angular4.0中form表单双向数据绑定正确姿势
issue:用[(ngModel)]="property"指令双向数据绑定,报错. reason1:使用ngModel绑定数据需要注入FormsModule模块,在app.modu ...
- 线上服务器上安装的VNCServer不能正常工作
1.问题描述: 线上服务器上安装的不能正常工作 2.解决问题过程: 一. 重启vncserver 运行命令:vncserver -kill :1和vncserver :1 二. 发现vncserver ...
- Python多线程编程(第二篇)
一.Python中的上下文管理器(contextlib模块) 上下文管理器的任务是:代码块执行前准备,代码块执行后收拾 1.如何使用上下文管理器: 如何打开一个文件,并写入"hello wo ...
- MySQL数据类型转换函数CAST与CONVERT的用法
MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值.两者具体的语法如下: 1.CAST(value as type) 就是CAST(xxx AS 类型) 2 ...
- Android基础_web通信
一.发展史 1G 模拟制式手机,只能进行语音通话2G 数字制式手机,增加接收数据等功能3G 智能手机,它已经成了集语音通信和多媒体通信相结合,并且包括图像.音乐.网页浏览.电话会议以及其它一些信息服务 ...
- Angular02 通过angular-cli来搭建web前端项目
利用angular-cli的常见命令: npm i --save 包名 -> 软件依赖 npm i --save-dev 包名 -> 开发依赖 ng new 项 ...
- SpringBoot集成security
本文就SpringBoot集成Security的使用步骤做出解释说明.
- python实现求最长子串长度
给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...