mysql存储引擎、事务

MySQL存储引擎介绍

文件系统

  • 操做系统组织和存取数据的一种机制。
  • 文件系统是一种软件。

文件系统类型

ext2  ext3  ext4  xfs 数据mysql

无论使用什么文件系统,数据内容不会变化sql

不一样的是,存储空间、大小、速度数据库

MySQL引擎

能够将MySQL引擎理解为:MySQL的“文件系统”,只不过功能更增强大。api

MySQL引擎的功能

除了能够提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能。缓存

MySQL 提供如下存储引擎:安全

– InnoDB
– MyISAM
– MEMORY
– ARCHIVE
– FEDERATED
– EXAMPLE
– BLACKHOLE
– MERGE
– NDBCLUSTER
– CSV

注:只有innodb与myisam最经常使用服务器

Innodb存储引擎简介

在MySQL5.5版本以后,默认的存储引擎,提供高可靠性和高性能。微信

Innodb引擎的优势

  1. 事务安全(听从ACID)
  2. MVCC(Multi-Versioning Concurrency Control,多版本并发控制):InnoDB行级锁、Oracle样式一致非锁定读取(共享锁)
  3. 表数据进行整理来优化基于主键的查询(汇集索引)
  4. 支持外键引用完整性约束
  5. 大型数据卷上的最大性能
  6. 将对表的查询与不一样存储引擎混合
  7. 出现故障后快速自动恢复(crash safe recovery)
  8. 用于在内存中缓存数据和索引的缓冲区池(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的oracle

使用mysqldump备份后,必定要替换备份的文件中的engine字段从myisam到innodb

不然迁移就没有意义

Innodb体系结构

物理存储结构(表空间): 

 

InnoDB 系统表空间

默认状况下,InnoDB 元数据、撤消日志和缓冲区存储在系统“表空间”中

表空间:MySQL数据库存储的方式

表空间中包含数据文件

MySQL表空间和数据文件是1:1的关系

共享表空间除外,是能够1:N关系

表空间类型

一、共享表空间:ibdata1~ibdataN,通常是2-3个

二、独立表空间:存放在指定库目录下

例如data/world/目录下的city.ibd 表空间位置(datadir):data/目录下

系统表空间的存储内容

共享表空间的物理存储结构(ibdata1~N),也一般被叫作系统表空间,是数据库初始化生成的。

一、系统元数据,基表数据,除了表内容数据以外的数据

二、undo日志(回滚日志)数据

三、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=1   ---->开启独立表空间,单表单存储
innodb_file_per_table=0   ---->关闭独立表空间,全部数据存放到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=10000-17      where id=我的微信号
update   t1  set  money=1000000+17  where id=二连长的微信号
以上语句都成功了,才能把产品给你

C --- Consistent(一致性)

若是数据库在事务开始时处于一致状态,则在执行该事务期间将保留一致状态。

例如:

update  t1 set  money=10000-17       where id=我的微信号
update   t1  set  money=1000000+17   where id=二连长的微信号
在以上操做过程没有彻底成功状况下,你去查本身的帐户,应该仍是10000块

I --- Isolated(隔离性)

事务之间不相互影响。

例如:

update  t1 set  money=10000-17       where id=我的微信号
update   t1  set  money=1000000+17  where id=二连长的微信号
1、在作以上操做的时候,其余人是不能对这两个帐户作任何的取款,存款操做
2、在不一样的隔离条件下,可能一致性保证又不同。

隔离级别会影响到一致性。

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,开启自动提交的优势:数据安全性好,每次修改都会落地。

缺点:

一、不能进行银行类的交易事务

二、产生大量的小IO

咱们能够经过如下命令进行修改关闭(0是关闭,1是开启)

SET GLOBAL AUTOCOMMIT=0; --- 全部新建会话
SET SESSION AUTOCOMMIT=0; --- 当前会话
SELECT @@AUTOCOMMIT; --- 查看设置结果

咱们也能够修改配置文件让其永久生效

vi /etc/my.cnf
[mysqld]
autocommit=0

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  | 5     |
| innodb_commit_concurrency      | 0     |
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
5 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              将一个事务的结果与其余事务彻底隔离

相关文章
相关标签/搜索