免費品牌網(wǎng)站制作百度網(wǎng)絡營銷
在實際的數(shù)據(jù)庫管理和性能優(yōu)化工作中,MySQL 慢查詢?nèi)罩?#xff08;slow query log)是一個重要的工具。當系統(tǒng)中的 SQL 查詢花費的時間超過閾值時,MySQL 會將這些查詢記錄在慢查詢?nèi)罩局?#xff0c;方便進行性能分析和調(diào)優(yōu)。
本文將介紹如何使用 Python 和正則表達式來整理 MySQL 慢查詢?nèi)罩?#xff0c;提取并排序 SELECT 查詢,并生成一個更易讀的輸出文件。
背景
慢查詢?nèi)罩臼?MySQL 中的一個功能,可以記錄執(zhí)行時間超過指定閾值的 SQL 查詢。日志中包含了每次慢查詢的執(zhí)行時間、查詢語句、用戶信息等。但有時候,日志文件可能包含大量無關緊要的信息,如用戶信息、時間戳等,而我們關心的可能只是查詢語句和執(zhí)行時間。
代碼解析
以下是整理 MySQL 慢查詢?nèi)罩镜?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() # 用于追蹤已經(jīng)出現(xiàn)過的查詢
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: ... 與后續(xù) 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)# 檢查是否已經(jīng)出現(xiàn)過這個查詢,如果沒有則添加到輸出if formatted_query not in seen_queries:seen_queries.add(formatted_query)select_queries.append((formatted_query, query_time))# 根據(jù) 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') # 用分隔線隔開不同查詢
代碼說明
- 讀取文件內(nèi)容: 使用
open
函數(shù)讀取慢查詢?nèi)罩疚募膬?nèi)容。 - 拆分查詢: 利用正則表達式將日志文件按照每個查詢的起始位置拆分成列表。
- 提取 SELECT 查詢: 通過檢查每個查詢是否包含關鍵詞
'select'
,過濾出慢查詢中的 SELECT 語句。 - 去除不必要信息: 使用正則表達式去除查詢中的用戶信息和
SET
語句。 - 排序查詢: 根據(jù)查詢的執(zhí)行時間進行排序,降序排列。
- 寫入文件: 將整理后的查詢寫入輸出文件,每個查詢之間用分隔線隔開。