以下内容翻译自mysql5.6官方手册。

InnoDB是一种通用存储引擎,可平衡高可靠性和高性能。在MySQL 5.6中,InnoDB是默认的MySQL存储引擎。除非已经配置了不同的默认存​​储引擎,否则发出没有ENGINE =子句的CREATE TABLE语句会创建一个InnoDB表。

InnoDB的主要优势包括:

  • 其DML操作遵循ACID模型,具有提交,回滚和崩溃恢复功能的事务以保护用户数据。
  • 行级锁定和Oracle风格一致的读取增加了多用户并发和性能。
  • InnoDB表将您的数据安排在磁盘上,以根据主键优化查询。每个InnoDB表都有一个主键索引,称为聚集索引,用于组织数据以最小化主键查找的I / O。
  • 为了保持数据的完整性,InnoDB支持FOREIGN KEY约束。检查外键,插入,更新和删除是否确保不会导致不同表之间的不一致。

 

使用InnoDB表时的最佳做法:

  • 使用最常查询的列或列指定每个表的主键,如果没有明显的主键,则指定自动递增值。
  • 根据这些表中ID值,使用连接从多个表中提取数据。对于快速连接性能,请在连接列上定义外键,并在每个表中声明具有相同数据类型的列。添加外键确保引用的列被索引,这可以提高性能。
  • 关闭自动提交。提交数百次,对性能有所限制(受到存储设备的写入速度的限制)。
  • 将相关的DML操作集合到事务中,通过将其与START TRANSACTION和COMMIT语句相结合。虽然您不想太经常提交,但您也不希望发布大量批量的INSERT,UPDATE或DELETE语句,而这些语句长时间不被提交。
  • 不使用LOCK TABLES语句。 InnoDB可以处理多个会话,一次读取和写入同一个表,而不会牺牲可靠性或高性能。要获取对一组行的独占写访问权限,请使用SELECT ... FOR UPDATE语法来锁定您要更新的行。

多版本存储引擎

InnoDB是一个多版本的存储引擎:它保存有关旧版本的行的信息,以支持事务功能,如并发和回滚。该信息存储在称为回滚段(在Oracle中类似的数据结构之后)的数据结构中的表空间中。 InnoDB使用回滚段中的信息执行事务回滚所需的撤消操作。它还使用这些信息来构建一行的较早版本以便一致性读取。

锁和事务

共享和独占锁

InnoDB实现标准的行级锁定,其中有两种类型的锁,共享(S)锁和排他(X)锁。

共享(S)锁允许保存锁的事务读取一行。

独占(X)锁允许持有锁的事务更新或删除行。

如果事务T1在行r上保持一个共享(S)锁,那么来自某个不同事务T2的针对行r上的锁的请求被处理如下:

可以立即授予T2对于S锁的请求。 因此,T1和T2都在r上持有S锁。

X锁定的T2请求不能被立即授予。

如果事务T1在行r上保持独占(X)锁定,则不能立即授予来自某个不同事务T2的对r类型的锁的请求。 相反,事务T2必须等待事务T1释放其在行r上的锁定。

非阻塞的一致读

 

和oracle一样,可以保证一个时间点的读一致性。读取的是读取时间点的数据。这是通过mmvp来实现的,同时,由于有mmvp的存在,可以实现非阻塞的读操作。

InnoDB中的不同SQL语句设置的锁

A locking read(使用了select for update 或者使用了serializerable隔离级别),UPDATE或DELETE通常在处理SQL语句时扫描的每个索引记录上设置记录锁(可能比真正的where语句中设置的行要多)。跟where语句中是否包含该行无关。 InnoDB不记得确切的WHERE条件,但只知道哪个索引范围被扫描。

如果没有适合您的语句的索引,MySQL必须扫描整个表来处理该语句,表中的每一行都将被锁定,从而阻止其他用户对表的所有插入。创建好的索引很重要,这样您的查询就不会不必要地扫描许多行。

InnoDB设置特定类型的锁如下。

  • SELECT ... FROM是一致的读取,读取数据库的快照,并且不设置锁定(任何锁都不设置 包含S锁),除非事务隔离级别设置为SERIALIZABLE。对于SERIALIZABLE级别,搜索会在遇到的索引记录上设置共享的下一个锁。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
  • SELECT ... FROM ... LOCK IN SHARE MODE在搜索遇到的所有索引记录上设置共享锁。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
  • SELECT ... FROM ... FOR UPDATE在搜索遇到的每个记录上设置独占锁。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
  • UPDATE ... WHERE ...在搜索遇到的每个记录上设置独占锁。但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
  • DELETE FROM ... WHERE ...在搜索遇到的每个记录上设置一个独占锁定但是,对于使用唯一索引锁定行来搜索唯一行的语句,只需要索引记录锁。
  • INSERT在插入的行上设置排他锁。

mysql innodb存储引擎 锁 事务的更多相关文章

  1. (转)Mysql技术内幕InnoDB存储引擎-事务&备份&性能调优

    事务 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC ...

  2. 浅析Mysql InnoDB存储引擎事务原理

    浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021

  3. MySQL InnoDB 存储引擎探秘

    在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中.从MySQL5.5.8开始,InnoDB成为其默认的存储引擎.InnoDB存储引擎支持事务.其设计目标主要是面向OLTP的应用, ...

  4. 设置mysql InnoDB存储引擎下取消自动提交事务

    mysql 存储引擎中最长用的有两种,MyISAM 存储引擎和InnoDB存储引擎. 1.MyISAM 存储引擎 不支持事务,不支持外键,优势是访问速度快: 2.InnoDB存储引擎 支持事务,一般项 ...

  5. MySQL InnoDB存储引擎体系架构 —— 索引高级

    转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...

  6. MySQL InnoDB存储引擎中的锁机制

    1.隔离级别 Read Uncommited(RU):这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用. Read Committed (RC):仅能读取到已提交 ...

  7. MySQL InnoDB存储引擎事务的ACID特性

    1.前言 相信工作了一段时间的同学肯定都用过事务,也都听说过事务的4大特性ACID.ACID表示原子性.一致性.隔离性和持久性.一个很好的事务处理系统,必须具备这些标准特性: 原子性(Atomicit ...

  8. MySQL InnoDB存储引擎

    200 ? "200px" : this.width)!important;} --> 介绍 本篇文章是对Innodb存储引擎的概念进行一个整体的概括,innodb存储引擎的 ...

  9. mysql innodb存储引擎介绍

    innodb存储引擎1.存储:数据目录.有配置参数为“ innodb_data_home_dir ” .“ innodb_data_file_path ” 和 “innodb_log_group_ho ...

随机推荐

  1. js控件实现修改预览的功能

    http://nytimes.github.io/ice/demo/ https://johnresig.com/projects/javascript-diff-algorithm/

  2. JavaScript高程第三版笔记(1-5章)

    第2章:在html中使用javascript ①script标签的defer属性 <script type="text/javascript" defer="def ...

  3. 并发编程之原子Atomic&Unsafe

    1.原子更新基本类型类   用于通过原子的方式更新基本类型,Atomic包提供了以下三个类: AtomicBoolean:原子更新布尔类型. AtomicInteger:原子更新整型. AtomicL ...

  4. list 属性字段直接转成字符串数组

    List<Car> cars = //whatever; string concat = String.Join(",", cars.Select(c => c. ...

  5. C#编程 socket编程之TcpClient,TcpListener,UdpClient

    应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务.这些协议类建立在 System.Net.So ...

  6. TensorFlow实战第六课(过拟合)

    本节讲的是机器学习中出现的过拟合(overfitting)现象,以及解决过拟合的一些方法. 机器学习模型的自负又表现在哪些方面呢. 这里是一些数据. 如果要你画一条线来描述这些数据, 大多数人都会这么 ...

  7. Flume概述

    flume是分布式的,可靠的,用于从不同的来源有效收集 聚集 和 移动 大量的日志数据用以集中式的数据存储的系统. 是apache的一个顶级项目. 系统需求:jdk1.6以上,推荐java1.7

  8. cp 命令

    cp - copy files and directories 用法: cp [OPTION] source dest DESCRIPTION Copy SOURCE to DEST, or mult ...

  9. java 寻找水仙花数

    题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数",因为153=1 ...

  10. mysql大数据量插入参考

    Mysql 千万数据10秒批量插入只需三步第一步:配置my.ini文件文件中配置bulk_insert_buffer_size=120M 或者更大将insert语句的长度设为最大.Max_allowe ...