mysql性能优化系列1-mysql架构

1. mysql性能指标

mysql性能中有两个重要性能指标:TPS和QPS。
(1)TPS
TPS(Transactions Per Second)是指服务器每秒处理的事务数。不过有的存储引擎不支持事务,无法用这个指标衡量。
TPS = (COM_COMMIT + COM_ROLLBACK)/UPTIME
(2) QPS
QPS(Queries Per Second)是指每秒查询处理量。
QPS=QUESTIONS/UPTIME
(3)等待时间(UPTIME)
指执行Sql语句等待返回结果之间的等待时间

2. MySQLSlap

MySQLSlap是mysql官方提供的性能压测工具,语法是mysqlslap [options]。
常用options参数说明:

  • create-schema=name:指定测试的数据库名
  • engine=name:创建测试表所使用的存储引擎,可指定多个
  • concurrency=N:模拟N个客户端并发执行,可指定多个值
  • number-of-queries=N:总的测试查询次数(并发客户数×每客户查询次数)
  • iterations=N :迭代执行的次数,即重复的次数(相同的测试进行N次,求一个平均值),这里指整个过程的重复次数,包括准备数据、测试load、清理
  • commit=N:执行N条DML后提交一次
  • auto-generate-sql, -a :自动生成测试表和数据,用mysqlslap工具自己生成的SQL脚本来测试并发压力
  • auto-generate-sql-load-type=name:要测试的环境是读操作还是写操作还是两者混合的。read、 write、 key (read primary keys)、 update (update primary keys), or mixed (half inserts, half scanning selects),默认值是:mixed
  • auto-generate-sql-add-auto-increment:对生成的表自动添加auto_increment列
  • number-char-cols=name:自动生成的测试表中包含N个字符类型的列,默认1个
  • number-int-cols=name:自动生成的测试表中包含N个数字类型的列,默认1个
  • debug-info:打印内存和CPU的信息

3. MySql逻辑架构

(1)逻辑模块
在这里插入图片描述

  • Management Services&Utilities:服务管理和控制,主要用来回滚操作、恢复数据、数据的复制、迁移、元数据的管理等
  • Connection Pool:连接池,主要用来管理用户连接,接收客户端请求并转发到相应的线程管理模块,对连接的进行权限认证
  • SQLInterface:SQL接口,用来接收管理SQL命令,存储过程,视图,触发器等
  • Parser:解析器,对SQL命令进行验证和解析。包括对SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型转发到后续步骤。如果在分解成数据结构中遇到错误,说明这个sql语句非法
  • Optimize:查询优化器,优化SQL语句,以最优策略去执行该SQL命令
  • Cache&Buffer:查询缓存,将SQL查询结果缓存到内存中,并与该查询的一个hash 值做对应。该查询结果数据的基表发生任何数据的变化之后,会自动使该查询对应的缓存失效。这个缓存机制是由一系列小缓存组成,比如表缓存,记录缓存,key缓存,权限缓存等
  • 存储引擎:MySQL的存储引擎是基于表的,每个表可选择各自的存储引擎

(2)逻辑架构
在这里插入图片描述
逻辑架构分为三层,连接层、SQL处理层、数据存储层。

  • 连接层:管理客户端的连接、对连接进行授权认证等。 MySQL启动后,每一个客户端发起连接请求,服务器都会新建一个线程处理(如果是线程池,则分配一个空闲线程),每个线程独立,拥有各自的内存处理空间。连接到服务器后,服务器需要进行验证,包括用户名密码、IP验证,是否具有执行某个特定查询的权限验证
  • SQL处理层:对SQL语句的解析、优化,管理缓存的查询,MySQL内置函数的实现,跨存储引擎功能,比如存储过程、触发器、视图等
  • 数据存储层:也叫存储引擎层,负责数据存储。存储引擎的不同,存储方式、数据格式、提取方式等都不相同

(3)SQL执行过程

  • 程序的请求会先通过connectors开始交互,请求到达后会暂存放在连接池connection pool,并由Management Serveices & Utilities管理。当请求从等待队列进入到处理队列,管理器会将请求发给SQL Interface
  • SQL接口接收到请求后,将请求进行hash并查询缓存中是否存在,如果存在直接返回结果
  • 如果上述缓存中不存在,SQL接口将请求发给Parser,Parser会将SQL转换为数据结构,如果转换出错,则停止处理
  • Parser转换完后交给Optimizer,Optimizer产生多种执行计划,并选择最优化的方案交给存储引擎
  • 存储引擎会查询存储设备中取得数据,并原路返回给程序

详细说明

  • MySQL通信协议是半双工,在任一时刻,要么是服务器向客户端发送数据,要么是客户端向服务器发送数据。一旦一端开始发送消息,另一端要接收完整个消息才能响应它。客户端用一个数据包发送请求给服务器,当查询语句很长需要设置max_allowed_packet参数,如果超出最大参数服务端会拒绝接收数据并抛出异常。服务器响应给用户的数据通常由多个数据包组成。客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送
  • 查询缓存是在解析SQL前,如果查询缓存是打开的,就基于SQL计算hash值,根据hash值去缓存查询,如果存在返回结果,SQL不会被解析,不会生成执行计划。这个哈希值通过查询本身、查询的数据库、客户端协议版本号等信息计算得来。如果查询中包含用户自定义函数、存储函数、用户变量、临时表、MySQL系统表,查询结果都不会被缓存。
    MySQL查询缓存系统会跟踪查询中涉及的每个表,如果这些表的数据或结构发生变化,那么和表相关的所有缓存数据都将失效。
    服务器缓存参数:query_cache_limit表示超出此大小的查询将不被缓存,
    query_cache_min_res_unit表示缓存块的最小值。query_cache_size表示查询缓存大小。
    query_cache_type表示缓存类型(0:禁用,1:缓存所有结果,DENAND:只缓存select语句中有SQL_CACHE指定)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章