高性能MySQL第三版笔记

  • 第1章 MySQL架构与历史
  • 1.1 MySQL逻辑架构
  • 1.2 并发控制
  • 1.3 事务
  • 1.4 多版本并发控制
  • 1.5 MySQL的存储引擎
  • 第3章 服务器性能剖析
  • 3.1 性能优化简介
  • 第4章 Schema与数据类型优化
  • 4.3 范式和反范式
  • 第5章 创建高性能的索引
  • 5.1 索引基础
  • 5.2 索引的优点
  • 5.3 高性能的索引策略
  • 5.3.1 独立的列
  • 5.3.5 聚簇索引
  • 5.4 索引案例学习
  • 第6章 查询性能优化
  • 6.1 为什么查询速度会慢
  • 6.2 慢查询基础:优化数据访问
  • 6.2.1 是否向数据库请求了不需要的数据
  • 6.4 查询执行的基础


第1章 MySQL架构与历史

1.1 MySQL逻辑架构

1.1 MySQL逻辑架构

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_02

1.2 并发控制

1.2.1 读写锁

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

1.2.2 锁粒度

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

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

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

表锁:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据_03


行级锁:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_04

1.3 事务

事务是一组原子性的SQL查询,或者说一个独立的工作单元。

如果数据库引擎能偶成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据_05


事务ACID特性:原子性,一致性,隔离性,持久性。

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_06


1.3.1 隔离级别

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_07

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_08

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_09


1.3.2 死锁

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_10


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_11


1.3.3 事务日志

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_12


1.3.4 MySQL中的事务

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

1.4 多版本并发控制

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_13


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_14


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_15


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据_16


MVCC只在可重复读和提交读这两个隔离级别下工作。

1.5 MySQL的存储引擎

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据_17

第3章 服务器性能剖析

3.1 性能优化简介

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

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

第4章 Schema与数据类型优化

4.3 范式和反范式

范式的优点:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_18

第5章 创建高性能的索引

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

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

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

5.1 索引基础

5.1.1 索引的类型

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

B-Tree索引

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

基于B+Tree的索引结构:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_database_19


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

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

哈希索引:

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

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_20


Memory引擎显式支持哈希索引。

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

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_21


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_22


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_23


全文索引:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_24

5.2 索引的优点

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_database_25


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据_26

5.3 高性能的索引策略

5.3.1 独立的列

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_27

5.3.5 聚簇索引

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据_28


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

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_database_29


InnoDB通过主键聚集数据,这也就是说上图中的“被索引的列”就是主键列。聚集数据的优点:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_30


非聚簇索引(二次索引):

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_31


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_database_32


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_33

5.4 索引案例学习

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据_34


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_35

第6章 查询性能优化

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

6.1 为什么查询速度会慢

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_36


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_37

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

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_38

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

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

这里有一些典型的案例:

查询不需要的记录:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据库_39


多表关联时返回全部列:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_40


总是取出全部列:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_mysql_41


重复查询相同的数据:

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_database_42

6.4 查询执行的基础

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

高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_数据_43


高性能mysql 第四版 pdf mobi azw3 高性能mysql(第3版)_MySQL_44