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为插入的一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为删除标识。
原文地址:https://www.cnblogs.com/JackShi/p/14804267.html