仅仅是笔记,用于自己理解

01mysql结构

02 日志(redo log(重做日志)和 binlog(归档日志))

redolog与binlog区别作用:https://www.jianshu.com/p/907f9002442e

2.1 Redolog(innodb独有的):

WAL技术(write-ahead-logging):先写日志,再写磁盘,mysql会先记录日志更新内存,然后就算成功了,等空闲的时候再写磁盘。

redolog有固定大小的,循环记录,满了会更新掉。
Redo log不是记录数据页“更新之后的状态”,而是记录这个页 “做了什么改动”。

2.2 BinLog(muysql的server层的日志):
Binlog有两种模式,statement 格式的话是记sql语句, row格式会记录行的内容,记两条,更新前和更新后都有。

两种日志的区别:

1)redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
2)redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
3)redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

redo是物理的,binlog是逻辑的;现在由于redo是属于InnoDB引擎,所以必须要有binlog,因为你可以使用别的引擎
保证数据库的一致性,必须要保证2份日志一致,使用的2阶段式提交;其实感觉像事务,不是成功就是失败,不能让中间环节出现,也就是一个成功,一个失败

两阶段提交:


如果有一天mysql只有InnoDB引擎了,有redo来实现复制,那么感觉oracle的DG就诞生了,物理的速度也将远超逻辑的,毕竟只记录了改动向量
binlog几大模式,一般采用row,因为遇到时间,从库可能会出现不一致的情况,但是row更新前后都有,会导致日志变大
最后2个参数,保证事务成功,日志必须落盘,这样,数据库crash后,就不会丢失某个事务的数据了
其次说一下,对问题的理解
备份时间周期的长短,感觉有2个方便
首先,是恢复数据丢失的时间,既然需要恢复,肯定是数据丢失了。如果一天一备份的话,只要找到这天的全备,加入这天某段时间的binlog来恢复,如果一周一备份,假设是周一,而你要恢复的数据是周日某个时间点,那就,需要全备+周一到周日某个时间点的全部binlog用来恢复,时间相比前者需要增加很多;看业务能忍受的程度
其次,是数据库丢失,如果一周一备份的话,需要确保整个一周的binlog都完好无损,否则将无法恢复;而一天一备,只要保证这天的binlog都完好无损;当然这个可以通过校验,或者冗余等技术来实现,相比之下,上面那点更重要

03 事务

1、务的特性:原子性、一致性、隔离性、持久性
2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读
3、事务隔离级别:读未提交、读提交、可重复读、串行化
4、不同事务隔离级别的区别:
读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到
读提交:一个事务提交之后,它所做的变更才可以被别的事务看到
可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见的
串行化:对应一个记录会加读写锁,出现冲突的时候,后访问的事务必须等前一个事务执行完成才能继续执行
5、配置方法:启动参数transaction-isolation,

查看数据库事务隔离级别:show variables like 'transaction_isolation';
6、事务隔离的实现:每条记录在更新的时候都会同时记录一条回滚操作。同一条记录在系统中可以存在多个版本,这就是数据库的多版本并发控制(MVCC)。
7、回滚日志什么时候删除?系统会判断当没有事务需要用到这些回滚日志的时候,回滚日志会被删除。
8、什么时候不需要了?当系统里么有比这个回滚日志更早的read-view的时候。
9、为什么尽量不要使用长事务。长事务意味着系统里面会存在很老的事务视图,在这个事务提交之前,回滚记录都要保留,这会导致大量占用存储空间。除此之外,长事务还占用锁资源,可能会拖垮库。
10、事务启动方式:一、显式启动事务语句,begin或者start transaction,提交commit,回滚rollback;二、set autocommit=0,该命令会把这个线程的自动提交关掉。这样只要执行一个select语句,事务就启动,并不会自动提交,直到主动执行commit或rollback或断开连接。
11、建议使用方法一,如果考虑多一次交互问题,可以使用commit work and chain语法。在autocommit=1的情况下用begin显式启动事务,如果执行commit则提交事务。如果执行commit work and chain则提交事务并自动启动下一个事务。
12,innodb利用了所有数据都有多个版本的这个特性,实现了秒级创建快照能力。
13
所以,我来给你翻译一下。一个数据版本,对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:
版本未提交,不可见;
版本已提交,但是是在视图创建后提交的,不可见;
版本已提交,而且是在视图创建前提交的,可见。

14 更新逻辑

总结:更新的时候其实需要先去读一次,而读的时候需要读到最新版本,这个时候就是锁了,需要在获得锁的时候才去当前读。

也就是说读的时候有多版本,但是写的时候需要获得最新版本和获得锁才会去更新

04-05 索引

1.索引的作用:提高数据查询效率
2.常见索引模型:哈希表、有序数组、搜索树
3.哈希表:键 - 值(key - value)。
4.哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置
5.哈希冲突的处理办法:链表
6.哈希表适用场景:只有等值查询的场景
7.有序数组:按顺序存储。查询用二分法就可以快速查询,时间复杂度是:O(log(N))
8.有序数组查询效率高,更新效率低
9.有序数组的适用场景:静态存储引擎。
10.二叉搜索树:每个节点的左儿子小于父节点,父节点又小于右儿子
11.二叉搜索树:查询时间复杂度O(log(N)),更新时间复杂度O(log(N))
12.数据库存储大多不适用二叉树,因为树高过高,会适用N叉树
13.InnoDB中的索引模型:B+Tree
14.索引类型:主键索引、非主键索引
主键索引的叶子节点存的是整行的数据(聚簇索引),非主键索引的叶子节点内容是主键的值(二级索引)
15.主键索引和普通索引的区别:主键索引只要搜索ID这个B+Tree即可拿到数据。普通索引先搜索索引拿到主键值,再到主键索引树搜索一次(回表)
16.一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。
17.从性能和存储空间方面考量,自增主键往往是更合理的选择。

18.查询流程及回表

19 覆盖索引

如果执行的语句是 select ID from T where k between 3 and 5,这时只需要查 ID 的值,而 ID 的值已经在 k 索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。

由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。 

20 最左前缀原则

就是当有索引是(a,b)的时候,需要根据a来查询的话不需要再单独建一个(a)索引,引擎会使用(a,b)索引

1)第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。

2)当有联合索引(a,b)的时候,需要根据b来查询的话那就要单独建一个(b)索引了,因为引擎不会使用(a,b)索引。

21 索引下推
mysql> select * from tuser where name like '张%' and age=10 and ismale=1;(索引:(name,age))

这条sql查询流程是先根据索引查name,然后回表查age,但是在5.6版本后,优化了,就是在根据索引查name的时候会先判断,如果查出来的数据中age不符合条件就不会回表查

06-07 锁

锁:全局锁,表级锁,行锁
全局锁:
全局读锁,命令:Flush tables with read lock
使用场景:做全库逻辑备份
single-transaction(视图一致性)方法只适用于所有的表使用事务引擎的库,如果不支持事务,那备份就要用全局读锁了。
表级锁
mysql表级锁有两种:表锁,元数据锁
表锁的语法是:lock table .. read/write
另一类表锁的锁是MDL,不需要显式使用,在访问一个表的时候会被自动加上,作用是,保证读写的正确性。
当对一个表做增删改查时,加mdl读锁,当要对表结构变更时,加mdl写锁
读锁之间不互斥,读写之间,写锁之间时互斥的
事务中的mdl锁,在语句执行开始的时申请,但是在语句结束后并不会马上释放,而是等到整个事务提交后再释放。
安全给小表加锁

行锁
行锁是在引擎层由各个引擎自己实现的。
在inndb事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放,这就是两阶段锁协议。
如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。
死锁解决策略

事务 A 在等待事务 B 释放 id=2 的行锁,而事务 B 在等待事务 A 释放 id=1 的行锁。 事务 A 和事务 B 在互相等待对方的资源释放,就是进入了死锁状态。

一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout (默认50)来设置。
二种种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑。
减少死锁的主要方向,就是控制访问相同资源的并发事务量

但是,死锁检测如果在热点更新的时候,会消耗大量的cpu资源

三种方案:
一种头痛医头的方法,就是如果你能确保这个业务一定不会出现死锁,可以临时把死锁检测关掉。
另一个思路是控制并发度。
你可以考虑通过将一行改成逻辑上的多行来减少锁冲突。

mysql实战45讲(01-08)基础篇笔记相关推荐

  1. 《MySQL实战45讲》实践篇 24-29 学习笔记 (主备篇)

    图片来自于极客时间,如有版权问题,请联系我删除. 24 | MySQL是怎么保证主备一致的? 主备切换流程如下: 建议把节点 B(也就是备库)设置成只读(readonly)模式. 1.有时候一些运营类 ...

  2. mysql 实战 45讲 学习笔记 基础知识 原理剖析

    MySQL 实战45讲 持续更新中~ 00讲 开篇 我们知道如何写出逻辑正确的SQL语句来实现业务目标,却不确定这个语句是不是最优的 我们听说了一些使用数据库的最佳实践,但是更想了解为什么这么做 我们 ...

  3. MySQL实战45讲学习笔记

    文章目录 MySQL实战45讲-学习笔记 01 基础架构:一条SQL查询语句是如何执行的? mysql逻辑架构 连接器 查询缓存 分析器 优化器 执行器 02 日志系统:一条SQL更新语句如何执行 r ...

  4. MySQL 实战45讲--笔记

    文章目录 MySQL 实战45讲-->笔记 开篇词 基础篇(8讲) 01 | 基础架构:一条SQL查询语句是如何执行的? 1.1 SQL 语句在 MySQL 的各个功能模块中的执行过程. 依次看 ...

  5. mysql实战45讲(15-22)

    mysql实战45讲学习笔记 15 日志与索引的关系 15.1 日志 1,分析一下在两阶段提交的不同时刻,MySQL 异常重启会出现什么现象. 如果在图中时刻 A 的地方,也就是写入 redo log ...

  6. 《MySQL实战45讲》——学习笔记01-03 “MySQL基本架构、日志系统、事务隔离“

    最近有新闻说"丁奇"炒股失败欠债,赶紧去极客时间买了他的<MySQL 实战 45 讲>以防下架,顺带重新系统的复习下MYSQL相关知识,记录下学习笔记: 本篇介绍: M ...

  7. MySQL实战45讲——MySQL是怎么保证数据不丢的?

    文章摘抄自林晓斌老师<MySQL实战45讲>.今天这篇文章, 我会继续和你介绍在业务高峰期临时提升性能的方法. 从文章标题"MySQL是怎么保证数据不丢的? ", 你就 ...

  8. mysql实战45讲(23-26)

    mysql实战45讲学习笔记 23 mysql保证数据不丢失 23.1,binlog的写入 逻辑:事务执行过程中,先把日志写到binlog cache中,事务提交的时候,再把cache写到binlog ...

  9. 《MySQL实战45讲》——学习笔记12 “InnoDB刷脏页的控制策略“

    本篇介绍MYSQL InnoDB的WAL机制带来的小问题--利用WAL技术,数据库将随机写转换成了顺序写,大大提升了数据库的性能,但也带来了内存脏页的问题: 脏页会被后台线程自动flush,也会由于数 ...

  10. 《Mysql实战45讲》学习笔记 1-22

    Mysql <Mysql实战45讲> 1.一条sql查询语句是如何执行的 Server层: 连接器,查询缓存,分析器,优化器,执行器 存储引擎层: 负责数据的存储和提取 (Innodb, ...

最新文章

  1. web编程速度大比拼(nodejs go python)(非专业对比)
  2. linux基础 云,云计算之linux基础一
  3. Python中类方法、类实例方法、静态方法,私有属性和私有方法有何区别?
  4. 慎用window.showModalDialog()
  5. [css] 如何解决IE6浮动时产生双倍边距的BUG?
  6. 【HDU - 5477】A Sweet Journey(思维,水题)
  7. 【Java数据结构】二叉排序树
  8. Windows 8 M2 Build 7955泄露下载
  9. 常见入门级显卡性能分析及对比(不定期更新)
  10. UltraEdit 注册机使用激活方法
  11. 宝塔面板无法安装php,宝塔面板安装php失败
  12. 用Java画一个圣诞树_java – 用“X”画一棵圣诞树
  13. 戴个美瞳却患上了角膜炎和干眼症?
  14. 【Nodejs】用http模块写一个简单的web服务器
  15. supersu二进制更新安装失败_supersu 二进制更新解决方法
  16. Local Maximum Mean Discrepancy
  17. linux下 Apache 配置虚拟主机三种方式
  18. 论文阅读笔记:《EIGENGAME: PCA AS A NASH EQUILIBRIUM》(特征博弈:主成分分析就是纳什均衡)
  19. 虚幻4中的程序化生成【1】程序化生成河流。
  20. 计算机考试计划,全国网络考试计算机复习计划

热门文章

  1. PowerDesigner英文字段转换中文字段显示
  2. SAP 计划策略组40、50对比分析
  3. java utf8 文件转gbk_java txt文件utf-8转GBK的问题
  4. 由于协议错误,会话将被中断。请重新连接到远程计算机
  5. 如何理解卡耐基的人际关系-----如何看清自身能力的积累?
  6. C++ CAD ObjectARX 2018介绍
  7. ThinkPHP 语言包切换中英文切换
  8. 小程序+spring boot记账微信小程序 毕业设计-附源码180815
  9. 基于HCL的校园网组建
  10. 微信小程序uniapp框架配置小程序分包