以下内容翻译自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. 【SVN】导出项目后报错汇总

    原文链接 1.jsp页面内:标点符号,引入报错 解决方法:关闭此项目的jsp验证,右键,最下面一个,Verification,右边一溜只留一个dtd就好 2. 编码问题-乱码 刚拉下来的项目编码可能与 ...

  2. 用Tcpdump抓包

    在安卓手机上抓包 1.将手机root并连上,记得开启开发者选项,并选择传输文件 2.将tcpdump程序拷到手机里面,可以直接在电脑上操作,也可以用adb 3.使用adb操作手机内核,安卓内核基于li ...

  3. linux新建文件夹

    mkdir -p .... -p  ----parents no error if existion, make parent directories as needed

  4. Linux C/C++基础 文件(中)

    1.ubuntu cat命令的实现 cat——查看或者合并文件内容 #include<stdio.h> int main(int argc,char* argv[]) { //1.打开文件 ...

  5. Linux C/C++基础——内存分区

    1.内存分区 在生活中,为了提高办事效率,某个单位经常会分成N个部门,每个部门职责不同,同样,为了提高 效率,我们的内存也会被分成N个区.这里我们将内存分为五个区.也有四区模型. 首先看一下一个二进制 ...

  6. IIS调试

    点击调试程序的时候默认启动TFS内置的调试服务器http://localhost:51607/,在该处填写自己在IIS上配置的站点就能进入自己的站点调试http://mr.ciwong.com

  7. 云风协程库coroutine源码分析

    前言 前段时间研读云风的coroutine库,为了加深印象,做个简单的笔记.不愧是大神,云风只用200行的C代码就实现了一个最简单的协程,代码风格精简,非常适合用来理解协程和用来提升编码能力. 协程简 ...

  8. java8 stream多字段排序

    注:转载请注明出处!!!!!!! 很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List<类> ...

  9. [转帖]glib gslibc libc 的关系与区别

    https://blog.csdn.net/Com_ma/article/details/78692092 [glibc 和 libc] glibc 和 libc 都是 Linux 下的 C 函数库. ...

  10. Python使用pycharm导入pymysql

    file->setting->project->project interperter,双击右侧出现的pip,弹出安装包,搜索pymysql->选择第一个->Instal ...