Python - 整理 MySQL 慢查询日志

在实际的数据库管理和性能优化工作中,MySQL 慢查询日志(slow query log)是一个重要的工具。当系统中的 SQL 查询花费的时间超过阈值时,MySQL 会将这些查询记录在慢查询日志中,方便进行性能分析和调优。

本文将介绍如何使用 Python 和正则表达式来整理 MySQL 慢查询日志,提取并排序 SELECT 查询,并生成一个更易读的输出文件。

背景

慢查询日志是 MySQL 中的一个功能,可以记录执行时间超过指定阈值的 SQL 查询。日志中包含了每次慢查询的执行时间、查询语句、用户信息等。但有时候,日志文件可能包含大量无关紧要的信息,如用户信息、时间戳等,而我们关心的可能只是查询语句和执行时间。

代码解析

以下是整理 MySQL 慢查询日志的 Python 代码:

import re# 本地文档文件路径
file_path = "1-16-1-22.txt"# 读取本地文档
with open(file_path, 'r', encoding='utf-8') as file:query_document = file.read()# 将文档按每个查询的起始位置拆分
queries = re.split(r'# Time: [\d-]+T[\d:.]+Z', query_document)[1:]# 提取并过滤SELECT查询
select_queries = []
seen_queries = set()  # 用于追踪已经出现过的查询
for query in queries:if 'select' in query.lower():# 使用正则表达式提取 Query_timequery_time_match = re.search(r'# Query_time: (\d+.\d+)', query)query_time = float(query_time_match.group(1)) if query_time_match else 0.0# 将 # Query_time: ... 与后续 SQL 查询语句分隔开query_lines = re.split(r'# Query_time: \d+.\d+.*?\n', query, flags=re.DOTALL)# 过滤掉空行query_lines = [line.strip() for line in query_lines if line.strip()]# 如果有多行 SQL 查询语句,加上换行formatted_query = "\n".join(query_lines)# 去除包含 # User@Host: ... 和 SET ... 的行formatted_query = re.sub(r'# User@Host:.*?\n', '', formatted_query)formatted_query = re.sub(r'SET.*?\n', '', formatted_query)# 检查是否已经出现过这个查询,如果没有则添加到输出if formatted_query not in seen_queries:seen_queries.add(formatted_query)select_queries.append((formatted_query, query_time))# 根据 Query_time 对 SELECT 查询进行排序
sorted_select_queries = sorted(select_queries, key=lambda x: x[1], reverse=True)# 将排序后的 SELECT 查询写入文件
with open('output.txt', 'w', encoding='utf-8') as output_file:for query, query_time in sorted_select_queries:output_file.write(f"Query_time: {query_time}\n")output_file.write(query + '\n')output_file.write("#" * 50 + '\n')  # 用分隔线隔开不同查询

代码说明

  1. 读取文件内容: 使用 open 函数读取慢查询日志文件的内容。
  2. 拆分查询: 利用正则表达式将日志文件按照每个查询的起始位置拆分成列表。
  3. 提取 SELECT 查询: 通过检查每个查询是否包含关键词 'select',过滤出慢查询中的 SELECT 语句。
  4. 去除不必要信息: 使用正则表达式去除查询中的用户信息和 SET 语句。
  5. 排序查询: 根据查询的执行时间进行排序,降序排列。
  6. 写入文件: 将整理后的查询写入输出文件,每个查询之间用分隔线隔开。

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

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

相关文章

24. 两两交换链表中的节点(力扣LeetCode)

文章目录 24. 两两交换链表中的节点题目描述解题思路只使用一个临时节点使用两个临时节点 24. 两两交换链表中的节点 题目描述 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff0…

angular2 开发遇到的问题

1:插件使用,要一同引入 不然报错 “ \ Changes detected. Rebuilding...X [ERROR] NG8001: sf-dashboard-overview is not a known element:”

微信扫码登录流程

微信官方文档使用 搜索“微信开放平台”点击导航栏的“资源中心”点击“网站应用”下的“微信登录功能”地址微信扫码登录是基于OAuth2的,所以需要第三方应用(就是实现微信扫码登录的应用)成为微信的客户端,获取AppId和AppSecret…

Linux 进程管理

一、简述 当运行一个程序的时候,那么运行的这个程序就叫做进程。程序,是一个静态的概念统称为软件,相当于一个被编译好可执行的二进制文件,同时程序可以长期存在系统中;进程,是一个动态的概念,…

在Python中如何在类中定义属性和方法

目录 1. 类的基本结构 2. 定义属性 3. 定义方法 4. 特殊方法和属性 5. 属性和方法的访问控制 6. 类属性与实例属性 总结 在Python中定义类的属性和方法是面向对象编程的核心概念之一。我将详细介绍如何在Python中定义类的属性和方法。 1. 类的基本结构 在Python中&…

多媒体测试资源

目录 简介自己整理的文件测试资源列表 简介 音视频测试时,需要许多源文件,这里整理了一些.会持续更新.当然可以使用ffmpeg转换获得需要的文件. 如果知道的这方面资源的,在评论区留言. 自己整理的文件 有视频,图片,音频. 链接:https://pan.baidu.com/s/1vatLmWk…

RHCE练习3

1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于www.openlab.com/student 网站访问学生信息,www.openlab.com/data网站访问教学资料www.openlab.com/mo…

Unix环境高级编程-学习-04-匿名管道PIPE

目录 一、环境 二、介绍 三、C标准函数介绍 1、pipe 2、popen 3、pclose 4、注意 四、宏 五、常见的管道用法 1、一对一(父进程读子进程写一条管道) 2、一对一(父进程写子进程读一条管道) 3、一对多(父进程…

leetcode—跳跃游戏—贪心算法

1 跳跃游戏1 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1&a…

洛谷P1824 进击的奶牛

参考代码 #include<iostream> #include<algorithm> using namespace std; const int MAXLEN 1e5 10; int nums[MAXLEN]; long long n, c; bool check(int x) {int cnt 1, pre nums[0];//贪心&#xff0c;第一头牛放在第一个隔间for(int i 1; i < n; i) {i…

C#: 导入excel文件到 dataGridView 控件

说明&#xff1a;文档介绍将 excel文件导入到 dataGridView 控件中的方法。 1.创建一个 dataGridView 控件 dataGridView_import_data&#xff0c;然后放置一个按键&#xff0c;给按键添加一个触发事件函数&#xff0c;函数内容如下。 2.在事件函数末尾添加了内存回收代码 &a…

通过 Footprint 的钱包地址属性解密身份和意图

作者&#xff1a;shellyfootprint.network 编译&#xff1a;mingfootprint.network Footprint Analytics 的钱包地址属性揭示了加密货币市场中深层的洞察力&#xff0c;揭示了钱包地址背后的身份和意图。这些标签&#xff0c;如“交易所”&#xff0c;“矿工”或“大鲸”&…

vue-computed 计算属性

一、computed 计算属性 在Vue应用中&#xff0c;在模板中双向绑定一些数据或者表达式&#xff0c;但是表达式如果过长&#xff0c;或者逻辑更为复杂 时&#xff0c;就会变得臃肿甚至难以维护和阅读&#xff0c;例如&#xff1a; <div>写在双括号中的表达式太长了,不利于阅…

Linux 入门基础知识(一)—— Linux的基本使用

Linux 入门基础知识 一、Linux的基本使用和配置1.1、终端1.2、消耗内存1.3、运行级别1.6、登录前欢迎语1.5、登录后欢迎语1.6、shell1.7、ps aux1.8、设置主机名1.9、whoami和who am i1.10、命令提示符 二、Linux执行命令的过程详解和命令类型2.1、命令执行2.2、hash缓存表2.3、…

面试 CSS 框架八股文十问十答第二期

面试 CSS 框架八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;对盒模型的理解 盒模型…

张维迎《博弈与社会》纳什均衡与囚徒困境博弈(2)囚徒困境博弈

囚徒困境大家应该都比较熟悉了&#xff0c;我觉得这篇的意义大概在与&#xff0c;经济学术语的运用&#xff1f; 囚徒困境&#xff1a;个人理性与集体理性的矛盾 假定有两个犯罪嫌疑人共同作案。警察抓住他们以后&#xff0c;分开拘押&#xff0c;并告诉他们&#xff1a;可以选…

Chiplet,汽车“芯”风向

异构集成、高速互联、算力灵活可扩展正在成为新一轮汽车芯片竞争的焦点。尤其是随着以ChatGPT为代表的大数据、大模型产品在车端的落地&#xff0c;对于芯片的要求还在持续提升。 本周&#xff0c;12家日本汽车制造商&#xff08;包括丰田、日产、本田等&#xff09;、零部件制…

设计与实现基于Java+MySQL的考勤发布-签到系统

课题背景 随着现代经济的迅速发展&#xff0c;电子考勤签到服务已经渗透到人们生活的方方面面&#xff0c;成为不可或缺的一项服务。在这个背景下&#xff0c;线上签到作为考勤签到的一种创新形式&#xff0c;为用户提供了便捷的操作方式&#xff0c;使得任务签到、个人签到记…

mac 窗口管理器

1、下载地址 链接: https://pan.baidu.com/s/1uINZgeoR4zBWgCtTvAi8zA?pwdvvfm 提取码: vvfm 2、配置可以直接网上搜教程

代码随想录算法训练营第35天 | 860.柠檬水找零 406.根据身高重建队列 452.用最少数量的箭引爆气球

柠檬水找零 局部最优&#xff1a;收到20元时优先找零10元5元&#xff0c;不够再找零3个5元&#xff0c;因为5元可以找零20和10&#xff0c;更有用。全局最优&#xff1a;完成所有的找零。 class Solution { public:bool lemonadeChange(vector<int>& bills) {int fi…