《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,就不可以查询其他的表。
多个事务并发执行,会出现的问题:
- 丢失更新:在没有事务隔离的情况下,两个事务同时更新一条数据,后一个事务会覆盖前面事务的更新,导致前面的事务丢失更新。
- 脏读:事务A先更新数据,但是没有提交,事务B读到了事务A没有提交的数据。
- 不可重复读:事务A中,先读到一条数据,事务A还没有结束,此时,事务B对该条数据进行了修改操作,事务A又读到了这条数据,事务A两次读到的数据不同。
- 幻读:事务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通知存储引擎提交事务。
参考
| 资料 | 网址 |
|---|---|
| MySQL性能优化篇 | https://mp.weixin.qq.com/mp/homepage?__biz=MzU4OTI3NzY4OA==&hid=2 |
| Innodb中的事务隔离级别和锁的关系 | https://tech.meituan.com/2014/08/20/innodb-lock.html |
《MySQL性能优化篇》阅读笔记的更多相关文章
- 阅读《RobHess的SIFT源码分析:综述》笔记
今天总算是机缘巧合的找到了照样一篇纲要性质的文章. 如是能早一些找到就好了.不过“在你认为为时已晚的时候,其实还为时未晚”倒是也能聊以自慰,不过不能经常这样迷惑自己,毕竟我需要开始跑了! 就照着这个大 ...
- RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件
SIFT源码分析系列文章的索引在这里:RobHess的SIFT源码分析:综述 imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特 ...
- RobHess的SIFT源码分析:综述
最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. 使用OpenCV中自带的Stitc ...
- 阅读《RobHess的SIFT源码分析:综述》笔记2
今天开始磕代码部分. part1: 1. sift特征提取. img1_Feat = cvCloneImage(img1);//复制图1,深拷贝,用来画特征点 img2_Feat = cvCloneI ...
- element-ui button组件 radio组件源码分析整理笔记(一)
Button组件 button.vue <template> <button class="el-button" @click="handleClick ...
- element-ui 组件源码分析整理笔记目录
element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...
- element-ui Carousel 走马灯源码分析整理笔记(十一)
Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
- element-ui MessageBox组件源码分析整理笔记(十二)
MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...
- element-ui switch组件源码分析整理笔记(二)
源码如下: <template> <div class="el-switch" :class="{ 'is-disabled': switchDisab ...
随机推荐
- 用 cgroups 管理 cpu 资源
转自:http://xiezhenye.com/2013/10/用-cgroups-管理-cpu-资源.html 这回说说怎样通过 cgroups 来管理 cpu 资源.先说控制进程的 cpu 使用. ...
- java 声明并初始化字符串变量
public class Sample { public static void main(String[] args) { String str = "Hello world"; ...
- (十六)golang--匿名函数
Go支持匿名函数,如果我们某个函数只是使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用: 匿名函数的使用方式:(1)在定义匿名函数的时候就直接调用,这种方式匿名函数只调用一次: (2)将匿名 ...
- CW2 Software Maintenance Spec Sheet
CW2 Software Maintenance Spec SheetAcademic Year 2019/2020CW2 is about maintaining and extending a r ...
- MAST 397B: Introduction to Statistical Computing
MAST 397B: Introduction to Statistical ComputingABSTRACTNotes: (i) This project can be done in group ...
- pandas的使用(7)--分组
pandas的使用(7)--分组
- 中文情感分析——snownlp类库 源码注释及使用
最近发现了snownlp这个库,这个类库是专门针对中文文本进行文本挖掘的. 主要功能: 中文分词(Character-Based Generative Model) 词性标注(TnT 3-gram 隐 ...
- C# 直接清空缓存方法
注意要使用 HttpContext.Current.Cache.Remove(cacheKey); 不能使用 HttpRuntime.Cache[cacheKey]=null;
- 最简单的 kubernetes 高可用安装方式
sealos 项目地址:https://github.com/fanux/sealos 本文教你如何用一条命令构建 k8s 高可用集群且不依赖 haproxy 和 keepalived,也无需 ans ...
- Python 学习:常用函数整理
整理Python中常用的函数 一,把字符串形式的list转换为list 使用ast模块中的literal_eval函数来实现,把字符串形式的list转换为Python的基础类型list from as ...