《高性能Mysql》学习笔记(二)(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 《高性能Mysql》学习笔记(二)(上)

前言


接续上文继续介绍:《高性能Mysql》学习笔记(一)


mysql 时间线



基准测试



为什么需要基准测试


基准测试策略


  • 基于mysql 单独测试 - 单组件式
  • 对整个系统整体测试 - 集成式
    使用整个系统测试原因主要如下


如果不需要关注整体应用,只关注msyql 性能


测试指标


  • 吞吐量
  • 响应时间或者延迟
  • 并发性
  • 可扩展性

应当避免以下情况再进行基准测试


获取系统性能和状态


获取基准测试结果


运行基准测试并分析结果


使用 shell , php, perl 都可以实现


结果分析图表

gnuplot > plot "qps-per-5-seconds" using 5 w lines title "qps"


基准测试工具


  • apach AB
  • http_load
  • jmeter


单组件式测试工具


  • mysqlslap
  • 包含在mysql5.1 的发行包当中,会自动生成查询schema的select 语句
  • mysql benchmark suite (sql-bench)
  • 优点:单线程,测试服务器执行查询的速度。
  • 有大量预定义的测试
  • 缺点:单用户模式,测试数据集很小而且无法指定数据
  • 无法测试多cpu能力
  • super mack
  • 用于 mysql 和 postgresql 基准测试工具
  • database test suite
  • 类似工业标准的测试工具
  • dbt2 免费的toc-c oltp 测试工具
  • percona's tpcc-mysql tool
  • mysql 高性能并发作者自己制作
  • sysbench
  • 多线程系统压测工具
  • 支持lua 语言


msyql 的 benchmark() 函数


Mysql 内置,可以测试某些特定操作的执行速度

方便的测试某些特定操作性能,比如md5() 比 sha1() 函数快


基准测试案例:

重点熟悉 sysbench 测试 ,因为和mysql 自身的设计最为贴合


服务器性能剖析


性能优化简介


一句话概括:性能即响应时间


原则


  1. 一定的工作负载之下尽可能的降低响应时间
  2. 无法测量就无法有效优化


忌讳


  1. 错误的时间启动和停止测量
  2. 测量的是聚合后的信息,而不是目标活动本身

完成一项任务可以分成两部分

  1. 执行时间:优化通过测量定位不同的子任务花费的时间,优化一些子任务,降低子任务的执行效率或者提升
  2. 等待时间

如何判断测量是正确的?

测量到底有多么不准确,记住一点,使用的测量数据而不是实际数据,测量数据也有多种表现。很容易推导出错误的结论


性能剖析进行优化



任务结束时间减去启动时间得到响应时间


性能剖析两种类型


  1. 基于时间分析
  1. 某时候执行时间就是在等待
  2. 比如i/o或者查询等待时间过久
  1. 基于等待分析


理解性能剖析


将最重要的任务展示在前面,但是没有显示的信息也很重要

值得优化的查询:

  1. 一些只占总响应时间比重很小的查询不值得优化
  2. 如果优化成本大于收益,要停止优化!

异常情况:

某些任务没有性能剖析输出也要优化,比如某些任务执行次数很少,但每次都很慢

未知的未知

好的剖析工具尽可能显示“丢失的时间”

丢失的时间: 任务的总时间和实际测量时间时间的差

被掩藏的细节:

平均值不能完全相信和作为根据

应用程序的性能剖析:

对于任何需要消耗时间的任务都可以进行性能分析

实用软件: New Relic


捕获查询到日志文件当中


  • mysql 5.0 之前, 慢查询日志的响应时间是秒
  • mysql 5.1 之后,慢查询被加强,可以做到微秒级别的查询

慢查询日志是进度最高测量查询的日志,开销几乎可以忽略不计,但是会消耗大量磁盘空间,


percona server 慢查询日志


  • 通过--processlist 选项不断查看 show full processlist 的输出
  • 通过抓取 tcp 网络包,根据mysql 客户端 /服务端 通信协议进行剖析

建议: 在服务器上使用慢查询日志捕获所有的查询

应该首先生成一个剖析报告,在进行慢查询


剖析报告


剖析单条查询


1. 使用 show profile

mysql 5.1 之后版本引入,默认是禁用的,但是可以通过服务器变量在连接中动态更改mysql> set profiling = 1

开启后会测量查询执行相关操作的状态

可能被 performance scheema 取代

该工具会讲剖析信息做成一张临时表

示例

  1. 执行下列语句


  1. 返回997行数据


  1. 继续看待下面输出
  2. 如果不使用上面方法,则使用下列方法


2. 使用 show status


该命令返回了一些计数器,既有 服务器界别全局计数器,也有基于某个连接的会话级别计数器,show global status 可以查询服务器启动时候开计算查询次数的统计

全局计数器也会出现在show status

猜测操作代价或者消耗时间较多的,可以使用句柄计数器, 临时文件和表计算器

示例


3. 使用慢查询日志(重点)


通过 pt_query_digest 发现“坏查询”

# query 1 :0 ops, 0x concurrency, ID oxeexxxs at byte 3214 ___

使用下面方法查看详情

tail -c +3214 /path/to/query.log | head -n100


4. 使用performance Schema

mysql 5.5 之后新增还不支持查询级别的剖析信息

下面是显示系统等待主要原因的查询:


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
7月前
|
消息中间件 缓存 弹性计算
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
305 11
|
2月前
|
SQL 关系型数据库 MySQL
索引设计实战:如何创建高性能MySQL索引
本文深入解析MySQL索引设计的核心原则与实战技巧,涵盖索引选择性、复合索引、性能优化及常见陷阱等内容,通过实际案例帮助开发者创建高效索引,显著提升数据库查询速度,助你打造高性能数据库系统。
|
6月前
|
存储 关系型数据库 MySQL
【免费动手教程上线】阿里云RDS MySQL推出大容量高性能存储:高性能本地盘(最高16TB存储空间)、高性能云盘(最高64TB存储空间)
阿里云RDS MySQL提供高性能本地盘与高性能云盘等存储方案,满足用户大容量、低延迟需求。高性能本地盘单盘最大16TB,IO延时微秒级;高性能云盘兼容ESSD特性,支持IO性能突发、BPE及16K原子写等能力。此外,阿里云还提供免费动手体验教程,帮助用户直观感受云数据库 RDS 存储性能表现。
|
10月前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
699 81
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
343 6
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
388 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
237 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
190 1
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
188 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)

推荐镜像

更多