《MySQL性能优化篇》阅读笔记

建表的时候,不要用null赋默认值,如:字符串的设置'',数据类型的设为0,不要将null设为默认值。

在MySQL中没有 full [outer] join,用union代替

各种 JOIN SQL:https://mp.weixin.qq.com/s?__biz=MzU4OTI3NzY4OA==&mid=2247483746&idx=1&sn=94b1a14569ff12a4776e48ee8e431ec3

使用 explain 命令显示查询执行计划时,key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。

in适合于外表大而内表小的情况,exists适合于外表小而内表大的情况。

当前会话对表A加上了读锁或写锁,即当前线程锁住了表A,只可以操作表A,就不可以查询其他的表。

多个事务并发执行,会出现的问题:

  1. 丢失更新:在没有事务隔离的情况下,两个事务同时更新一条数据,后一个事务会覆盖前面事务的更新,导致前面的事务丢失更新。
  2. 脏读:事务A先更新数据,但是没有提交,事务B读到了事务A没有提交的数据。
  3. 不可重复读:事务A中,先读到一条数据,事务A还没有结束,此时,事务B对该条数据进行了修改操作,事务A又读到了这条数据,事务A两次读到的数据不同。
  4. 幻读:事务A先读到一批数据,假设读到10条,事务B插入了一条数据,此时,事务A又读这一批数据,发现多了一条,好像幻觉一样。

解决方案--数据库隔离机制

数据库隔离机制 说明 解决的问题
1. 未提交读(read uncommitted) 这是数据库最低的隔离级别,允许一个事务读另一个事务未提交的数据。 解决了丢失更新,但是会出现脏读、不可重复读、幻读。
2. 提交读(read committed) 一个事务更新的数据 在提交之后 才可以被另一个事务读取,即一个事务不可以读取到另一个事务未提交的数据。 解决了丢失更新和脏读,但是会出现不可重复读和幻读。
3. 可重复读(repeatale read) 这是数据库默认的事务隔离级别,保证一个事务在相同条件下前后两次读取的数据是一致的。 解决了丢失更新、脏读和不可重复读,但是会出现幻读。(注:乐观锁可以解决幻读)
4. 序列化(serializable) 这是数据库最高的隔离级别。事务串行执行,不会交叉执行。 解决了所有的问题。

Innodb中的事务隔离级别和锁的关系

MySQL、ORACLE、PostgreSQL等成熟的数据库,出于性能考虑,都是使用了以乐观锁为理论基础的MVCC(多版本并发控制)来避免这两种问题。
行锁防止别的事务修改或删除,GAP锁防止别的事务新增,行锁和GAP锁结合形成的的Next-Key锁共同解决了RR级别在写数据时的幻读问题。

MVCC在MySQL的InnoDB中的实现,详见:https://tech.meituan.com/2014/08/20/innodb-lock.html

master记录二进制日志:

在每个事务更新数据完成之前,master在二进制日志记录这些改变。
MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。
在事件写入二进制日志完成后,master通知存储引擎提交事务。

https://mp.weixin.qq.com/s?__biz=MzU4OTI3NzY4OA==&mid=100000132&idx=1&sn=c3771b2e09739dfa49ebd0cd8b8d0a92&scene=19#wechat_redirect

参考

资料 网址
MySQL性能优化篇 https://mp.weixin.qq.com/mp/homepage?__biz=MzU4OTI3NzY4OA==&hid=2
Innodb中的事务隔离级别和锁的关系 https://tech.meituan.com/2014/08/20/innodb-lock.html
原文地址:https://www.cnblogs.com/cag2050/p/11808283.html