MySQL优化实战学习笔记(一)

1 Mysql与系统的交互

1.1 Mysql驱动

Mysql驱动的功能:在底层建立网络连接。才能够帮助我们发送请求给数据库服务器。

1.2 数据库连接池

当我们多线程的处理请求的时候,显然不可能只用一个数据库连接,然后不停的建立连接、删除连接。效率太差了。

因此需要构建一个数据库连接池,在这个连接池子中有很多个数据库连接。

当sql语句执行结束后,不要销毁这个连接,而是放回数据库连接池中,下次再用

2 Mysql的架构设计

2.1 监听和读取数据的线程

MySQL中有一个线程专门负责:从网络连接中读取和解析数据

2.2 接受SQL语句的SQL接口

MYSQL提供了一个接口:SQL Interface

这个接口专门执行接收到的SQL语句。

2.3 解析SQL语句的SQL解析器

SQL解析器就是按照SQL的语法规则进行解析,理解这一句SQL语句到底要干嘛。

2.4 选择最优查询路径的查询优化器

在理解SQL要干啥以后,查询优化器会给出一个最优的查询路径方案。

查询优化器会根据SQL语句生成查询路径树,然后从树中找到最优的查询路径。

2.5 调用存储引擎执行器

执行器会根据由查询优化器得出的执行方案,不停的调用存储引擎的各种接口去完成SQL语句的执行计划。

2.6 执行SQL语句的数据库存储引擎

存储引擎会根据SQL的查询方案,分别调用内存和磁盘,进行查询、更新等复杂操作。

MYSQL的架构设计中,SQL接口、SQL解析器、SQL查询优化器都是通用的,但是存储引擎可以有很多选择。

3 初步了解InnoDB

3.1 缓冲池:Buffer Pool

缓冲池是一个由InnoDB存放在内存中的组件,里面缓存了很多数据。

3.1.1 初步查询

假设要查询id=10

  • 如果数据已经在缓冲池中,则直接加载。
  • 如果数据不在缓冲池中,则从磁盘中加载到缓冲池,并且添加独占锁。

3.1.2 undo日志文件

为了满足日后回滚的需要。会把写入数据的旧值,写入undo日志文件

3.1.3 更新缓冲池

更新内存中的BufferPool的数据。

这时候的数据是脏数据,因为BufferPool中的数据已经修改,但是磁盘中的数据没有被修改。

3.1.4 Redo Log Buffer

为了防止此时宕机,导致修改丢失。必须把对于内存中BufferPool的修改内容,拷贝一份,写在redo日志中。

所谓redo日子主要记录了,你对于数据做了什么修改,类似于:“id=10这行记录修改了name字段的值为XXX”

3.1.5 写回redo日志

当想要提交事务时,mysql会根据一定策略,把redo日志文件写回磁盘。

这个策略是通过:innodb_flush_log_at_trx_commit配置

  • 参数为0:提交事务时不会写回redo日志
  • 参数为1:只有写回成功,才会提交事务成功。常用这个方法,最为稳妥
  • 参数为2:将redo日志写回OSCache中,稍后(可能1s)写回磁盘

3.1.6 写回binlog日志

binlog日志是归档日志,是mysqlServer自己的日志文件。redo日志文件是InnoDB的日志文件。

当我们提交策略时,同时还会把binlog日志写回磁盘文件。

binlog日志文件同样存储了对于数据更新的操作。

binlog可以通过sync_binlog参数控制策略:

  • 默认参数0:写入OSCache
  • 参数1:写回磁盘

3.1.7 完成事物条件的条件

redo文件中会保存:binlog文件名和位置,同时在redo文件中写入一个commit标记。

redo文件中的commit标记的意义:

  • 确保redo中有本次更新的日志文件
  • 确保binlog中有本次更新的日志文件
  • 确保redo和binlog中的关于本次更新的日志文件完全相同

3.1.8 后台IO线程随机将内存更新后的脏数据刷入磁盘

MySQL后台会有一个IO线程,在未来的某个时间里,把BufferPool中的数据刷会磁盘文件中。

4 生产环境下数据库机器配置

4.1 低并发、低流量、操作频率低、用户量小

虽然可能的业务逻辑复杂,但是并不需要关心数据库的机器配置,随便选一个。

4.2 机器配置与并发

  • 4核心8G内存:每秒500并发。很迷你自己玩玩。
  • 8核心16G内存:每秒1500并发。起步,一般般,容易出现压力问题
  • 16核心32G内存:每秒3000并发。常用,比较推荐。

5 数据库压力测试

申请到一个数据库以后,应该在实际开发之前就对这个数据库进行压力测试。
主要原因如下:

  • Java系统测试和数据库测试是两回事。
  • 首先必须知道数据库的极限,才能以这个极限去设计Java系统

QPS:Query Per Second 和 TPS:Transaction Per Second

QPS简单理解为,每秒数据库可以处理多少个sql语句。
TPS简单理解为,每秒数据库可以处理的事物数量。这个比较常用。

5.1 IO测试相关的指标

IOPS

IOPS指的是机器的随机IO并发处理能力,代表每秒钟可以执行多少个随机IO请求。

一个很关键的指标。主要决定你内存中的脏数据写回磁盘的效率

吞吐量

机器磁盘存储每秒可以读写多少字节的数据量。

关键指标。关乎到每秒可以把多少的redo log等日志文件写入磁盘。

latency

重要的指标。往磁盘里面写入一条数据的延时。

延迟越低,数据库性能越高,执行每个SQL语句和事物的速度会越快。

5.2 一些其他的次重要的指标

CPU负载

简而言之,看看你CPU能不能发出足够多的QPS。

网络负载

简而言之,看看你的网络带宽情况支持不支持大流量的传输数据。

内存负载

简而言之,看看你内存还够不够。

posted @ 2021-04-11 22:43  Yiyang_Cai  阅读(98)  评论(0编辑  收藏  举报