高性能MySQL第三版笔记

第1章 MySQL架构与历史

1.1 MySQL逻辑架构

1.1 MySQL逻辑架构

在这里插入图片描述
在这里插入图片描述

1.2 并发控制

1.2.1 读写锁

读共享,写互斥,写者优先读者

1.2.2 锁粒度

尽量只锁定需要修改的数据,而不是所有的数据。锁定的数据量越少,则系统的并发程度越高。

但是加锁也需要消耗资源。锁的操作,包括获取锁,检查锁是否已经解除,释放锁等,都会增加系统的开销。

所谓的锁策略,就是在锁的开销和数据的安全性之间寻求平衡,两种最重要的锁策略:表锁的行级锁

表锁:
在这里插入图片描述
行级锁:

在这里插入图片描述

1.3 事务

事务是一组原子性的SQL查询,或者说一个独立的工作单元。
如果数据库引擎能偶成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。
在这里插入图片描述
事务ACID特性:原子性,一致性,隔离性,持久性。
在这里插入图片描述
1.3.1 隔离级别

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
1.3.2 死锁

在这里插入图片描述
在这里插入图片描述
1.3.3 事务日志

在这里插入图片描述
1.3.4 MySQL中的事务

MySQL默认采用自动提交(AUTOCOMMIT)模式。也就是说,如果不是显式地开启一个事务,则每个查询都被当做一个事务执行提交操作。

1.4 多版本并发控制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
MVCC只在可重复读和提交读这两个隔离级别下工作。

1.5 MySQL的存储引擎

在这里插入图片描述

第3章 服务器性能剖析

3.1 性能优化简介

性能定义为完成某件任务所需要的时间度量,换句话说,性能即响应时间。

性能优化就是在一定的工作负载下尽可能地降低响应时间。

第4章 Schema与数据类型优化

4.3 范式和反范式

范式的优点:

在这里插入图片描述

第5章 创建高性能的索引

索引是存储引擎用于快速找到记录的一种数据结构

索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。

索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高几个数量级。

5.1 索引基础

5.1.1 索引的类型

索引有很多种类型。索引是在存储引擎层而不是服务器层实现的。

B-Tree索引

实际上很多存储引擎包括InnoDB引擎使用的是B+Tree,即每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。

基于B+Tree的索引结构:

B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针指向下层查找。通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上限和下限。最终存储引擎要么是找到对应的值,要么该记录不存在。

叶子节点比较特别,它们的指针指向的是被索引的数据,而不是其他的节点页。

哈希索引:

InnoDB并不显式支持哈希索引,InnoDB会自适应创建哈希索引,不会受用户控制。

在这里插入图片描述
Memory引擎显式支持哈希索引。

下面来看一个例子,假设有如下表:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
全文索引:

在这里插入图片描述

5.2 索引的优点

在这里插入图片描述
在这里插入图片描述

5.3 高性能的索引策略

5.3.1 独立的列

在这里插入图片描述

5.3.5 聚簇索引

在这里插入图片描述
下图展示了聚簇索引中的记录是如何存放的。叶子页包含了行的全部数据,但是节点页只包含了索引列。

在这里插入图片描述
InnoDB通过主键聚集数据,这也就是说上图中的“被索引的列”就是主键列。

聚集数据的优点:
在这里插入图片描述
非聚簇索引(二次索引):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.4 索引案例学习

在这里插入图片描述
在这里插入图片描述

第6章 查询性能优化

查询优化、索引优化、库表结构优化需要齐头并进,一个不落。

6.1 为什么查询速度会慢

在这里插入图片描述
在这里插入图片描述

6.2 慢查询基础:优化数据访问

在这里插入图片描述

6.2.1 是否向数据库请求了不需要的数据

有些查询会请求超过实际需要的数据,然后这些多余的数据会被应用程序丢弃。这会给MySQL服务器带来额外的负担,并增加网络开销,另外也会消耗应用服务器的CPU和内存资源。

这里有一些典型的案例:

查询不需要的记录:
在这里插入图片描述
多表关联时返回全部列:
在这里插入图片描述
总是取出全部列:

在这里插入图片描述
重复查询相同的数据:

在这里插入图片描述

6.4 查询执行的基础

当向MySQL发送一个请求的时候,MSQL到底做了些什么?

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

触不可及<>

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值