以下内容翻译自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. Microsoft Visual Studio 中工具箱不显示DevExpress控件的解决办法

    我安装的是DevExpress15.2 1.找到安装目录D:\Program Files\DevExpress15.2\Components\Tools, 运行控制台 内容换成cmd 2.执行下面的命 ...

  2. 关于虚拟机docker 启动mysql 启动成功但未挂载到端口

    首先排查了防火墙和其他权限相关问题 然后检查了mysql 用户权限问题 docker logs 查看日志 正常应该是到3306 问题是我的mysql my.cnf 文件是挂在在本地.当第二次启动容器时 ...

  3. 牛客小白月赛12-C(欧拉筛解积性方程)

    题目链接:https://ac.nowcoder.com/acm/contest/392/C 题意:给定n,求: 思路:令res[i]=iN  (%MOD),因为xn是一个积性函数,即(x*y)n=x ...

  4. 从零开始,SpreadJS 新人学习笔记(第二周)

    Hello,大家好,我是Fiona.经过上周的学习,我已经初步了解了SpreadJS的目录结构,以及如何创建Spread项目到我的工程目录中.>>还不知如何开始学习SpreadJS的同学, ...

  5. 2. zookeeper介绍及集群搭建

    ZooKeeper 概述 Zookeeper 是一个分布式协调服务的开源框架. 主要用来解决分布式集群中 应用系统的一致性问题,例如怎样避免同时操作同一数据造成脏读的问题. ZooKeeper 本质上 ...

  6. 设计模式:模板方法(Template method)

    首先我们先来看两个例子:冲咖啡和泡茶.冲咖啡和泡茶的基本流程如下: 所以用代码来创建如下: 咖啡:Caffee.java public class Coffee { void prepareRecip ...

  7. thinkphp5.1 关于加载静态资源路径问题

    和thinkphp5.0不一样,thinkphp5.1的 thinkphp5.0的 直接在config.php文件中加入代码: <?phpreturn [ 'view_replace_str' ...

  8. python基础之 线程_进程关系

    上图

  9. idea 去除重复代码提醒

  10. Hadoop单节点启动分布式伪集群

    emm~ 写这篇博客只是手痒,因为开发环境用单节点就够了,生产环境肯定是真实集群,所以这个伪分布式纯属娱乐而已. 配置HDFS1. 安装好一台hadoop,可以参考这篇博客.2. 在hadoop目录下 ...