zoukankan      html  css  js  c++  java
  • mysql innodb存储引擎 锁 事务

    以下内容翻译自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在插入的行上设置排他锁。
  • 相关阅读:
    自介
    打招呼
    试验四
    作业:实验二
    个人简介
    实验4
    构建之法—心得体会
    作业:实验二
    个人简介
    软件测试第四次博客作业2
  • 原文地址:https://www.cnblogs.com/xiaolang8762400/p/7273918.html
Copyright © 2011-2022 走看看