mysql存储引擎、事务
MySQL存储引擎介绍
文件系统
- 操作系统组织和存取数据的一种机制。
- 文件系统是一种软件。
文件系统类型
ext2 ext3 ext4 xfs 数据
不管使用什么文件系统,数据内容不会变化
不同的是,存储空间、大小、速度
MySQL引擎
可以将MySQL引擎理解为:MySQL的“文件系统”,只不过功能更加强大。
MySQL引擎的功能
除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能。
MySQL 提供以下存储引擎:
– InnoDB
– MyISAM
– MEMORY
– ARCHIVE
– FEDERATED
– EXAMPLE
– BLACKHOLE
– MERGE
– NDBCLUSTER
– CSV
注:只有innodb与myisam最常用
Innodb存储引擎简介
在MySQL5.5版本之后,默认的存储引擎,提供高可靠性和高性能。
Innodb引擎的优点
- 事务安全(遵从ACID)
- MVCC(Multi-Versioning Concurrency Control,多版本并发控制):InnoDB行级锁、Oracle样式一致非锁定读取(共享锁)
- 表数据进行整理来优化基于主键的查询(聚集索引)
- 支持外键引用完整性约束
- 大型数据卷上的最大性能
- 将对表的查询与不同存储引擎混合
- 出现故障后快速自动恢复(crash safe recovery)
- 用于在内存中缓存数据和索引的缓冲区池(buffer pool(data buffer page log buffer page) 、undo buffer page)
查看数据库的存储引擎设置
使用SELECT确认会话存储引擎:
SELECT @@default_storage_engine;
show variables like '%engine%';
使用SHOW确认每个表的存储引擎:
SHOW CREATE TABLE City\G
SHOW TABLE STATUS LIKE 'CountryLanguage'\G
使用INFORMATION_SCHEMA确认每个表的存储引擎:
SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'City' AND TABLE_SCHEMA = 'world'\G
设置存储引擎
基本不需要修改设置存储引擎
在启动配置文件中设置服务器存储引擎:
[mysqld]
default-storage-engine=<Storage Engine>
使用 SET 命令为当前客户机会话设置:
SET @@storage_engine=<Storage Engine>;
在CREATE TABLE 语句指定:
CREATE TABLE t (i INT) ENGINE = <Storage Engine>;
从5.1版本迁移到5.5以上版本的mysql注意修改存储引擎
假如5.1所有生产表都是myisam的
使用mysqldump备份后,一定要替换备份的文件中的engine字段从myisam到innodb
否则迁移就没有意义
Innodb体系结构
物理存储结构(表空间):

InnoDB 系统表空间
默认情况下,InnoDB 元数据、撤消日志和缓冲区存储在系统“表空间”中
表空间:MySQL数据库存储的方式
表空间中包含数据文件
MySQL表空间和数据文件是1:1的关系
共享表空间除外,是可以1:N关系
表空间类型
1、共享表空间:ibdata1~ibdataN,一般是2-3个
2、独立表空间:存放在指定库目录下
例如data/world/目录下的city.ibd 表空间位置(datadir):data/目录下
系统表空间的存储内容
共享表空间的物理存储结构(ibdata1~N),也通常被叫做系统表空间,是数据库初始化生成的。
1、系统元数据,基表数据,除了表内容数据之外的数据
2、undo日志(回滚日志)数据
3、tmp表空间(一般很少关注)
ib_logfile0~N(redo日志)
存放的是innodb表的重做日志。
注释:
undo日志默认是在ibdata中的,在5.6以后是可以单独定义的。
tmp表空间在5.7版本以后也被移出了ibdata1,ibtmp1
在5.5版本以前,所有的应用数据也都默认存放到了ibdata中
数据独立表空间
除了系统表空间之外,InnoDB 还在数据库目录中创建另外的表空间,用于每个 InnoDB 表的 .ibd 文件。
InnoDB 创建的每个新表在数据库目录中设置一个 .ibd 文件来搭配表的 .frm 文件。
在5.6以后,默认的情况下,会单表单独存储到独立表空间文件中。
独立表空间设置:
show variables like '%per_table%';
在参数文件/etc/my.cnf可以控制独立表空间功能是否开启,5.6默认开启的。
innodb_file_per_table= ---->开启独立表空间,单表单存储
innodb_file_per_table= ---->关闭独立表空间,所有数据存放到ibdata中
设置共享表空间
通过添加数据文件增加表空间大小。
在 my.cnf 文件中使用 innodb_data_file_path 选项
[mysqld]
innodb_data_file_path=datafile_spec1[;datafile_spec2]
配置共享表空间实例
配置示例:创建一个表空间,其中包含一个名为 ibdata1 且大小为 12 MB (固定)的数据文件和一个名为 ibdata2 且大小为 100 MB(自动扩展)的数据文件:
一般是在初始搭建环境的时候就定义好,一般2-3个共享表空间文件
预设值1G,最后一个文件自动扩展
vi /etc/my.cnf
innodb_data_file_path=ibdata1:12M;ibdata2:100M:autoextend
默认情况下将文件放置在 data 目录中。
如果需要,显式指定文件位置。
Innodb引擎、事务
事务生命周期图

事务ACID
A --- Atomic(原子性)
所有语句作为一个单元全部成功执行或全部取消。
例如:
update t1 set money=- where id=个人微信号
update t1 set money=+ where id=二连长的微信号
以上语句都成功了,才能把产品给你
C --- Consistent(一致性)
如果数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。
例如:
update t1 set money=- where id=个人微信号
update t1 set money=+ where id=二连长的微信号
在以上操作过程没有完全成功情况下,你去查自己的账户,应该还是10000块
I --- Isolated(隔离性)
事务之间不相互影响。
例如:
update t1 set money=- where id=个人微信号
update t1 set money=+ where id=二连长的微信号
、在做以上操作的时候,其他人是不能对这两个账户做任何的取款,存款操作
、在不同的隔离条件下,可能一致性保证又不一样。
隔离级别会影响到一致性。
read-uncommit 做了操作就显示结果了
read-commit 可能会用的一种级别,
repeatable-read 默认级别,和oracle一样,
serializable 严格模式,一般不用
D --- Durable(持久性)
事务成功完成后,所做的所有更改都会准确地记录在
数据库中。所做的更改不会丢失。
事务的控制语句
- START TRANSACTION(或 BEGIN):显式开始一个新事务
- SAVEPOINT:分配事务过程中的一个位置,以供将来引用
- COMMIT:永久记录当前事务所做的更改
- ROLLBACK:取消当前事务所做的更改
- ROLLBACK TO SAVEPOINT:取消在 savepoint 之后执行的更改
- RELEASE SAVEPOINT:删除 savepoint 标识符
- SET AUTOCOMMIT:为当前连接禁用或启用默认autocommit模式
主要:
begin 事务开始的标记
commit 事务成功提交的标记
rollback 事务回滚的标记
autocommit 设置,控制是否每条DML语句自动提交,生产中要关掉 autocommit=0;也就是设置为手工提交事务的模式;
设置为1,开启自动提交的优点:数据安全性好,每次修改都会落地。
缺点:
1、不能进行银行类的交易事务
2、产生大量的小IO
我们可以通过以下命令进行修改关闭(0是关闭,1是开启)
SET GLOBAL AUTOCOMMIT=; --- 所有新建会话
SET SESSION AUTOCOMMIT=; --- 当前会话
SELECT @@AUTOCOMMIT; --- 查看设置结果
我们也可以修改配置文件让其永久生效
vi /etc/my.cnf
[mysqld]
autocommit=
redo
redo,顾名思义“重做日志”,是事务日志的一种。
作用:在事务ACID过程中,实现的是“D”持久化的作用。
先将数据提取到内存中进行操作,在修改完成后,redo记录数据变化的过程,就算事务的完成,然后就算是断电事务没来的及写入磁盘,下次开启数据库redo也会先执行修改数据。
innodb_flush_log_at_trx_commit ---- 此参数控制着事务提交的时候刷新redo日志
mysql> show variables like '%commit%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| autocommit | ON |
| binlog_order_commits | ON |
| innodb_api_bk_commit_interval | |
| innodb_commit_concurrency | |
| innodb_flush_log_at_trx_commit | |
+--------------------------------+-------+
rows in set (0.00 sec)

undo
undo,顾名思义“回滚日志”,是事务日志的一种。
作用:在事务ACID过程中,实现的是“A、C”原子性和一致性的作用。
在将数据提取到内存打算修改数据的时候,undo会将数据没改的时候做一个快照,然后如果有一方失败,事务就会返回致原样。
事务中的锁
在事务ACID过程中,“锁”和“隔离级别”一起来实现“I”隔离性的作用。
四种隔离级别:建议使用REPEATABLE READ
READ UNCOMMITTED 允许事务查看其他事务所进行的未提交更改
READ COMMITTED 允许事务查看其他事务所进行的已提交更改
REPEATABLE READ 确保每个事务的 SELECT 输出一致(InnoDB 的默认级别)
SERIALIZABLE 将一个事务的结果与其他事务完全隔离
mysql存储引擎、事务的更多相关文章
- 浅析Mysql InnoDB存储引擎事务原理
浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021
- Mysql存储引擎及选择方法
0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...
- Mysql存储引擎比较
Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...
- MySQL存储引擎之Myisam和Innodb总结性梳理
Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
- 【转】mysql存储引擎
http://www.cnblogs.com/kevingrace/p/5685355.html Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM In ...
- 第 3 章 MySQL 存储引擎简介
第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...
- MySQL存储引擎总结
MySQL存储引擎总结 作者:果冻想 字体:[增加 减小] 类型:转载 这篇文章主要介绍了MySQL存储引擎总结,本文讲解了什么是存储引擎.MyISAM.InnoDB.MEMORY.MERGE等内 ...
- Mysql存储引擎__笔记
Mysql存储引擎(表类型): Mysql数据库: 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以使存储器上一些文件的集合或者一些内存 数据的内存数据的集合. Mysql数据库是开放源代 ...
随机推荐
- ArcGIS字段计算器分割字段中的字符串
ArcGIS字段计算器分割字段中的字符串 实例:在一个字段中存有长宽高三个属性数据,以x分割.例如sss为字段名(字段属性为文本类型),数据格式为:100x200x300,利用字段计算器分别将三个数存 ...
- underscore.js 源码阅读 准备
本次阅读是初次阅读源码,参考了以下几篇文章: https://github.com/hanzichi?language=javascript&page=5&tab=stars http ...
- js随机生成验证码及其颜色
今天迎来了2018年第一场雪,这个美好的日子,总的写点什么纪念一下,在这里写了一个在js中使用Math.random()函数,随机生成四位数的验证码及其验证码换颜色. js代码如下: var arra ...
- Linux上常用软件安装和总结
Linux总结: 以前只顾着撸码,Linux这些一般都是运维玩的,然后也没怎么折腾过,每次上线也都只是发布下,最多也就是启停服务器.最近闲来无事就玩了玩Linux,还挺好的. 这里做一个总结来结束Li ...
- java1.8--Optional类
身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...
- MyEclipse设置jsp页默认打开方式
可以用来设置jsp页默认打开是代码编辑模式而不是半视图半代码的模式. 1.选择菜单Window→Preferences. 2.选择General→Editors→File Associations.在 ...
- ado.net 参数传递之 in
之前项目有一放行的功能,对某界面维护时(数据的增删改),先将数据保存到临时表中,放行后再真正的写入到库中.由于设计到主从表多中约束关系,所以当时我采用的是写一个存储过程来对某个界面的操作进行统一处理, ...
- Win10微软帐户切换不回Administrator本地帐户的解决方法--(转,虽转但亲测有效)
在Win10系统中经常会用到微软帐户登录,如应用商店等地方,不过一些用户反馈原来使用Administrator帐户被绑定微软帐户后无法切换回本地帐户,连[改用本地帐户登录]按钮都没有,那么怎么解决呢? ...
- mysql主从延迟高的原因
1.1.1故障1:从库数据与主库冲突 1 2 3 4 5 6 show slave status; 报错:且show slave status\G Slave_I/O_Running:Yes Slav ...
- 主备(keepalived+nginx)
实验环境 系统: centos 6.9 mini 机器名 ip 虚拟ip kn1 192.168.126.10 kn2 ...