文章目录

    • 引言
    • 一、关键性能指标解读
      • 1. QPS(Queries Per Second):每秒查询数
      • 2. TPS(Transactions Per Second):每秒事务数
      • 3. 缓存命中率
    • 二、性能监控工具介绍与使用
      • 1. SHOW STATUS
      • 2. Prometheus + Grafana
        • (1)安装与配置Prometheus
        • (2)安装与配置Grafana
        • (3)创建监控仪表盘
    • 三、总结

引言

在数据库的世界里,MySQL凭借其开源、高效、稳定的特性,成为众多企业和开发者的首选。然而,随着数据量的增长和业务复杂度的提升,MySQL的性能问题逐渐凸显。为了确保MySQL数据库能够稳定、高效地运行,深入理解性能指标并掌握有效的监控方法至关重要。本文将围绕QPS、TPS、缓存命中率等关键性能指标展开解读,并详细介绍使用SHOW STATUS、Prometheus + Grafana等工具进行性能监控的具体方法。

一、关键性能指标解读

1. QPS(Queries Per Second):每秒查询数

QPS是衡量MySQL数据库处理查询能力的重要指标,它表示数据库在每秒内能够处理的查询请求数量。无论是简单的SELECT查询,还是复杂的带有连接、子查询的SQL语句,都会被统计在QPS中。在实际业务场景中,QPS的高低直接影响着应用程序的响应速度和用户体验。

以一个电商网站为例,用户在浏览商品列表、搜索商品时,都会向MySQL数据库发送查询请求。假设在某个促销活动期间,电商网站的QPS从平时的1000飙升到5000,这就意味着数据库需要在每秒内处理更多的查询请求。如果数据库的性能无法满足这一需求,就会导致页面加载缓慢,甚至出现卡顿、超时等问题,严重影响用户的购物体验。

在MySQL中,可以通过SHOW STATUS命令来获取QPS相关的信息。下面是一个简单的示例:

SHOW STATUS LIKE 'Queries';
-- 执行该命令后,会返回一个结果集,其中包含了从MySQL服务器启动以来执行的查询总数

为了计算QPS,我们需要记录两个时间点的查询总数,并计算它们的差值,再除以时间间隔。可以使用以下Python代码来实现(假设使用mysql-connector-python库连接MySQL数据库):

import mysql.connector
import time# 连接到MySQL数据库
mydb = mysql.connector.connect(host="localhost",user="your_username",password="your_password",database="your_database"
)mycursor = mydb.cursor()# 获取初始查询总数
mycursor.execute("SHOW STATUS LIKE 'Queries'")
start_queries = mycursor.fetchone()[1]
start_time = time.time()# 等待一段时间(例如10秒)
time.sleep(10)# 获取结束时的查询总数
mycursor.execute("SHOW STATUS LIKE 'Queries'")
end_queries = mycursor.fetchone()[1]
end_time = time.time()# 计算QPS
qps = (end_queries - start_queries) / (end_time - start_time)
print(f"QPS: {qps}")mycursor.close()
mydb.close()

上述代码首先连接到MySQL数据库,获取初始的查询总数,等待一段时间后,再次获取查询总数,最后根据时间间隔计算出QPS。

2. TPS(Transactions Per Second):每秒事务数

TPS用于衡量MySQL数据库在每秒内能够处理的事务数量。事务是数据库操作的基本单元,它包含了一组相关的SQL语句,这些语句要么全部成功执行,要么全部回滚,以保证数据的一致性和完整性。在实际应用中,涉及到数据更新、插入、删除等操作的业务场景,如订单处理、库存管理等,TPS指标尤为重要。

以一个在线支付系统为例,当用户完成支付时,系统需要在数据库中执行一系列操作,包括扣除用户账户余额、增加商家账户余额、记录交易日志等,这些操作通常会被封装在一个事务中。如果该系统的TPS较低,在高并发的支付场景下,就会出现支付响应缓慢、交易失败等问题,给用户和商家带来损失。

同样,我们可以使用SHOW STATUS命令来获取与TPS相关的信息。在MySQL中,与事务相关的状态变量有Com_commit(提交的事务数)和Com_rollback(回滚的事务数)。计算TPS的方法与计算QPS类似,通过记录两个时间点的Com_commitCom_rollback的总和,并计算差值,再除以时间间隔。以下是Python实现代码:

import mysql.connector
import time# 连接到MySQL数据库
mydb = mysql.connector.connect(host="localhost",user="your_username",password="your_password",database="your_database"
)mycursor = mydb.cursor()# 获取初始提交事务数和回滚事务数
mycursor.execute("SHOW STATUS LIKE 'Com_commit'")
start_commit = mycursor.fetchone()[1]
mycursor.execute("SHOW STATUS LIKE 'Com_rollback'")
start_rollback = mycursor.fetchone()[1]
start_time = time.time()# 等待一段时间(例如10秒)
time.sleep(10)# 获取结束时的提交事务数和回滚事务数
mycursor.execute("SHOW STATUS LIKE 'Com_commit'")
end_commit = mycursor.fetchone()[1]
mycursor.execute("SHOW STATUS LIKE 'Com_rollback'")
end_rollback = mycursor.fetchone()[1]
end_time = time.time()# 计算TPS
tps = ((end_commit - start_commit) + (end_rollback - start_rollback)) / (end_time - start_time)
print(f"TPS: {tps}")mycursor.close()
mydb.close()

该代码通过获取不同时间点的提交事务数和回滚事务数,计算出每秒处理的事务数量。

3. 缓存命中率

缓存命中率是指在数据库查询过程中,从缓存中获取数据的请求次数占总请求次数的比例。MySQL提供了多种缓存机制,如查询缓存(Query Cache,不过在MySQL 8.0中已被移除)、InnoDB缓冲池等。合理利用缓存可以显著减少数据库从磁盘读取数据的次数,提高查询性能。

以一个新闻网站为例,新闻详情页面的内容在一段时间内通常不会发生变化。如果将这些新闻数据缓存在内存中,当用户访问新闻详情页时,数据库可以直接从缓存中获取数据,而无需再次从磁盘读取,这样就能大大提高页面的加载速度。

对于InnoDB缓冲池的缓存命中率,我们可以通过以下方式进行计算。首先,使用SHOW ENGINE INNODB STATUS命令获取InnoDB引擎的状态信息,然后从中提取与缓冲池相关的变量。以下是一个简单的Python示例,用于计算InnoDB缓冲池的缓存命中率(假设使用mysql-connector-python库连接MySQL数据库):

import mysql.connector
import re# 连接到MySQL数据库
mydb = mysql.connector.connect(host="localhost",user="your_username",password="your_password",database="your_database"
)mycursor = mydb.cursor()# 获取InnoDB引擎状态信息
mycursor.execute("SHOW ENGINE INNODB STATUS")
status_info = mycursor.fetchone()[0]# 从状态信息中提取缓冲池读取请求数和磁盘读取请求数
innodb_buffer_read_requests = int(re.search(r'innodb_buffer_pool_read_requests: (\d+)', status_info).group(1))
innodb_buffer_reads = int(re.search(r'innodb_buffer_pool_reads: (\d+)', status_info).group(1))# 计算缓存命中率
hit_rate = innodb_buffer_read_requests / (innodb_buffer_read_requests + innodb_buffer_reads) * 100
print(f"InnoDB缓冲池缓存命中率: {hit_rate}%")mycursor.close()
mydb.close()

上述代码通过执行SHOW ENGINE INNODB STATUS命令获取InnoDB引擎状态信息,再使用正则表达式提取缓冲池读取请求数和磁盘读取请求数,最后计算出缓存命中率。

二、性能监控工具介绍与使用

1. SHOW STATUS

SHOW STATUS是MySQL内置的一个命令,它可以用于查看数据库服务器的各种状态信息,包括前面提到的QPS、TPS相关的变量,以及连接数、慢查询数量等。该命令使用简单,无需额外安装其他软件,非常适合在日常开发和运维过程中快速了解数据库的运行状态。

例如,我们想要查看当前数据库的连接数,可以执行以下命令:

SHOW STATUS LIKE 'Threads_connected';
-- 执行该命令后,会返回当前连接到MySQL服务器的线程数量,即连接数

如果想要查看慢查询的数量(假设已开启慢查询日志),可以使用以下命令:

SHOW STATUS LIKE 'Slow_queries';
-- 该命令会返回从MySQL服务器启动以来执行的慢查询总数

通过定期执行SHOW STATUS命令,并记录相关状态变量的值,我们可以分析数据库性能的变化趋势,及时发现潜在的性能问题。

2. Prometheus + Grafana

Prometheus是一个开源的系统监控和报警工具包,它可以从各种数据源中收集指标数据,并进行存储和查询。Grafana是一个可视化工具,它可以将Prometheus收集到的数据以图表、仪表盘等形式直观地展示出来。将Prometheus和Grafana结合使用,可以实现对MySQL数据库性能的全面监控和可视化分析。

(1)安装与配置Prometheus

首先,需要从Prometheus官方网站下载对应操作系统的安装包,并解压到指定目录。然后,需要对Prometheus进行配置,使其能够收集MySQL的性能指标数据。

在Prometheus的配置文件prometheus.yml中,添加以下内容(假设使用mysqld_exporter来采集MySQL数据,需要提前安装并启动mysqld_exporter):

global:scrape_interval: 15s  # 数据采集间隔scrape_configs:- job_name:'mysql'static_configs:- targets: ['localhost:9104']  # mysqld_exporter的运行地址和端口metrics_path: /metricsparams:module: [mysql]relabel_configs:- source_labels: [__address__]target_label: __param_target- source_labels: [__param_target]target_label: instance- target_label: __address__replacement: 127.0.0.1:9104  # mysqld_exporter的实际地址和端口

上述配置文件中,scrape_interval指定了数据采集的间隔时间,job_name为任务名称,targets指定了mysqld_exporter的运行地址和端口。配置完成后,启动Prometheus服务。

(2)安装与配置Grafana

从Grafana官方网站下载安装包,并按照对应操作系统的安装指南进行安装。安装完成后,打开Grafana的Web界面(默认地址为http://localhost:3000),使用默认的用户名和密码(admin/admin)登录。

登录后,首先需要添加Prometheus作为数据源。在Grafana的管理界面中,点击“Data Sources”,然后点击“Add data source”,选择“Prometheus”。在配置页面中,输入Prometheus的地址(如http://localhost:9090,根据实际情况填写),并保存配置。

(3)创建监控仪表盘

在Grafana中创建一个新的仪表盘,然后添加Panel(面板)来展示不同的性能指标。例如,要展示QPS指标,可以添加一个Graph类型的Panel。在Panel的配置页面中,选择数据源为之前添加的Prometheus,然后在Metrics查询框中输入以下查询语句:

rate(mysql_global_status_queries{instance="localhost:9104"}[1m])

上述查询语句使用Prometheus的查询语法,通过rate函数计算在过去1分钟内mysql_global_status_queries指标的增长率,即QPS。同样地,我们可以添加其他Panel来展示TPS、缓存命中率等性能指标。

通过Prometheus + Grafana的组合,我们可以实时、直观地监控MySQL数据库的各项性能指标,并通过设置报警规则,在性能指标出现异常时及时发出警报,以便运维人员能够快速响应和处理问题。

三、总结

深入理解QPS、TPS、缓存命中率等关键性能指标,是优化MySQL数据库性能的基础。通过SHOW STATUS命令,我们可以快速获取数据库的运行状态信息;而Prometheus + Grafana的组合,则为我们提供了更加全面、可视化的性能监控方案。在实际的数据库运维工作中,我们应根据业务需求和系统特点,灵活运用这些性能指标和监控工具,及时发现并解决性能问题,确保MySQL数据库能够稳定、高效地运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86272.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86272.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86272.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香橙派3B学习笔记13:deb 打包调用系统库与.so动态链接库的程序(部分失败)

之前接触到了snap打包自己的应用程序与依赖,但它的默认沙盒隔离的机制导致其访问系统库有局限性,它在访问硬件资源的时候没有的那些权限需要额外声明,不符合应用发布的便携性要求。 本文学习下如何用deb打包的方式打包自己需要调用系统库的程…

第二十届“开源中国开源世界”大会:openKylin AI创新实践与成果分享

2025年6月13日,第二十届“开源中国开源世界“大会在北京万寿宾馆隆重召开。本届大会由开源软件推进联盟(COPU)主办,以“共建人工智能时代的开源生态”为主题,汇聚来自全球开源与AI领域的专家学者、技术领袖与前沿企业&…

微算法科技开发基于布尔函数平方和表示形式的最优精确量子查询算法

随着量子计算的迅猛发展,精确量子查询算法的研究成为量子信息科学的一个重要课题。量子决策树算法,作为量子计算的核心,微算法科技(NASDAQ:MLGO)提出了一种新的方式来解决布尔函数查询问题。该框架从布尔函数的平方和表…

鸿蒙(HarmonyOS)布局系统详解:Flex、Grid、Stack等布局方式全面解析

在移动应用和分布式系统开发中,界面布局是构建优秀用户体验的基础。鸿蒙操作系统(HarmonyOS)作为华为推出的全场景分布式操作系统,提供了一套强大而灵活的布局系统。本文将全面解析鸿蒙的布局方式,包括Flex、Grid、Stack等核心布局技术&#…

【软件系统架构】系列四:嵌入式软件开发流程全解析(包含示例)

目录 一、需求分析阶段 二、系统架构设计阶段: 三、开发准备阶段 四、底层驱动开发阶段(HAL / BSP) 五、操作系统集成阶段(RTOS / OS) 六、中间件与协议栈集成阶段 七、应用逻辑开发阶段 八、调试与测试阶段: 九、集成与联调阶段 十、发布与维护阶段 总结:完…

接口自动化测试面试(高频面试常问)+答案

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、结合项目讲解项…

Kubernetes 从入门到精通-StatefulSet控制器

一、StatefulSet 基础概念 1. 与 Deployment 的关键区别 特性StatefulSetDeployment网络标识稳定的 DNS 名称随机生成存储每个 Pod 独立 PVC,数据持久化 共享存储或无状态启停顺序严格按序号顺序(0→N-1 启动,N-1→0 停止)并行适…

Redis ①②-事务

Redis 事务 先来看看 MySQL 事务的四大特性: 原子性:将事务里的多个操作打包成一个整体,要么全部成功,要么全部失败,失败后会进行回滚操作。一致性:确保事务执行前后,其数据的整体变化一致。隔…

Leetcode+JAVA+回溯

39.组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复…

嘉讯科技:医院电子病历系统的关键性作用

电子病历系统在现代医疗领域发挥着至关重要的作用。 电子病历系统极大地提高了医疗效率。以往,医生需要翻阅大量的纸质病历,耗费时间和精力去查找关键信息。而电子病历系统通过数字化的存储和检索方式,使得医生能够在短时间内获取患者的完整病…

解决 Docker 里 DrissionPage 无法连接浏览器的问题,内含直接可用的Docker镜像(DrissionPage 浏览器链接失败 怎么办?)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 报错现象与诊断 📒📑 源码🐞 DrissionPage 报错内容🐞 手动启动 Chrome 测试📒 原因分析与解决方案 📒🔍 为什么会这样?🔧 解决办法🔧 推荐方案🎯 测试🐳 可直接使用的Docker镜像 🐳📦 镜像下载地址…

Mysql 数据库中设备实时状态表水平分表

一、 需求概述 在使用 Mysql 数据库存储设备上报日志时,存在一张设备实时状态表,随着时间推移,数据量变得十分庞大。为了更好地管理和查询数据,提高数据库性能,需要对该表进行水平分表操作。同时,存在分页…

nginx的下载与安装 mac

1. 下载 方法一:本地下载 链接:https://nginx.org/en/download.html(可直接搜官网) 下载到本地后,上传到linux的某个文件夹中 方法二:直接linux上下载(推荐) wget -c http://ngi…

在 Mac 上配置 Charles,抓取 iOS 手机端接口请求

工具官网:https://www.charlesproxy.com/ Charles 激活码 一、简介 Charles 是一款强大的网络抓包工具,支持 HTTP 和 HTTPS 协议,适用于调试手机 App、微信小程序、H5 页面等网络请求。 它能作为代理服务器,转发并记录本机及其他…

较大项目 git(gitee, github) 拉取失败解决方法

问题描述 近期遇到了一个拉取一个比较大项目失败的问题,229M这么大 每次都失败 我在自己的PC上,只有极好的环境才能拉取,笔记本办公热点怎么都不行 解决办法 后面通过https链接 首次会报错,因为我输入错了gitee的username&am…

爬虫中网络知识基础

HTTP(HyperText Transfer Protocol)和 HTTPS(HyperText Transfer Protocol Secure)是互联网上用于传输网页内容等数据的两种主要协议,以下是它们的定义和基本工作原理: HTTP 定义 :HTTP 是一种…

安全工具-二进制安全-testssl.sh

1 需求 --openssl <PATH> &#xff1a;use this openssl binary (default: look in $PATH, $RUN_DIR of testssl.sh) --quiet&#xff1a;dont output the banner. By doing this you acknowledge usage terms normally appearing in the banner --severity <severity…

WHAT - 组件库与 Storybook

文章目录 什么是 Storybook&#xff1f;使用场景举例快速上手教程&#xff08;React 为例&#xff09;1. 安装 Storybook2. 创建一个 Story&#xff08;组件故事&#xff09;3. 启动 Storybook 常用功能常见生态扩展示例&#xff1a;用 Args 和 Controls 动态控制 Props推荐资料…

魔音音乐 5.0.2 | 无损下载 同步网易云歌单UI美观

魔音音乐是一款功能丰富的音乐播放软件&#xff0c;提供高保真音质、智能推荐系统和用户友好界面。其丰富的音乐库几乎覆盖了所有类型的音乐&#xff0c;无论是流行歌曲还是小众音乐&#xff0c;都能在这里找到。这款应用非常适合音乐爱好者使用&#xff0c;它不仅让你享受高品…

云原生时代的中国答案:OLARDB、OceanBase与PostgreSQL的共生革命

以下是对阿里自研数据库的全景式技术调查,重点梳理其产品体系、与PostgreSQL的技术关联及发展历程: 一、阿里自研数据库全景图谱 ​​1. 核心自研产品​​ ​​数据库名称​​​​类型​​​​技术定位​​​​与PostgreSQL关系​​​​PolarDB​​云原生分布式数据库存储计…