zoukankan      html  css  js  c++  java
  • Mysql高性能

    1. 事务的四大特性

    ACID
    1. 原子性(atomicity)
      事务是不可分割的最小单元,要么全部成功,要么全部失败
    2. 一致性(consistency)
      数据库总是从一个一致性的状态转换到另一个一致性状态(与原子性类似,一个事务中的sql不可能存在只生效一部分的状态)
    3. 隔离性(isolation)
      一个事务所做的修改在最终的提交之前,对其他事务不可见
    4. 持久性
      一旦事务提交,所做的任何修改就会永久保存到数据库

    2. 隔离级别

    注意:较低级别的隔离通常可以执行更高的并发,系统开销更低
    1. read uncommited(未提交读)
        事务中的修改即使没有提交,对其他事务也是可见的。会造成脏读。很少使用
    2. read commited(提交读)
        大多数数据库系统的默认级别都是提交读(mysql是可重复读)。提交之前对其他事务不可见。也叫做不可重复读,执行两次童谣那个的查询,结果可能不一样
    3. repeatable read(可重复读)
        同一个事务中,多次读取同样的记录的结果是一致的。但是解决不了幻读。
    4. serializable(可串行化)
        隔离的最高级别。在读取数据的时候给读到的每一行加锁。只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑使用该级别。
    
    mysql为什么不使用提交读级别?
    参考地址:https://www.cnblogs.com/shoshana-kong/p/10516404.html

    3. 事务日志

    事务日志可以帮助提高事务的效率。 提交事务先将事务记录到磁盘的一小块地方,持久保存。然后按照日志来修改内存中的对应数据,然后再慢慢的写到磁盘里面进行持久化。即使中途断电,只要日志保存了,在重启数据库的时候,系统会自动更新。

     4. MVCC(多版本并发控制) 

    每种数据库系统的实现方式可能不同,我们这里只说innoDB的MVCC。
    注意:MVCC只有在读已提交和可重复读两个默认级别时有效
    
    innoDB在每行记录后面保存两个隐藏的列。这两个列一个保存了行的创建时间,一个保存了过期时间(或者删除时间),当然存储的不是具体的时间值,而是系统版本号。
    事务开始时的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
    
    1. select语句
        innoDB会根据以下两个条件检查每行记录
        a. 查找版本早于当前事务版本的数据行(也就是行的系统版本号小于或者等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前存在或者由事务自身插入或者修改。
        b. 行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。
        只有符合以上两个条件的记录,才能作为查询结果返回
    
    2. insert语句
        InnoDB为新插入的每一行保存当前版本系统版本号作为行版本号
    3. delete
        innoDB为删除的每一行保存当前系统版本号作为删除标识
    4. update
        innoDB为插入的一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为删除标识。
  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/JackShi/p/14804267.html
Copyright © 2011-2022 走看看