MySQL慢查询优化、日志收集定位排查、慢查询sql分析
MySQL慢查询日志收集、定位,慢查询分析、排查。
一 MySQL慢查询定位
1. 确定是否已开启慢查询日志
查看慢查询日志是否已经被开启:
SHOW VARIABLES LIKE 'slow_query_log';
如果返回值是'OFF',你需要开启它。
2. 开启慢查询日志
你可以临时在运行中的MySQL实例中开启慢查询日志:
SET GLOBAL slow_query_log = 'ON';
或者你可以在`my.cnf`(或`my.ini`)配置文件中,加入以下设置,然后重启MySQL来永久开启它:
slow_query_log = 1slow_query_log_file = /path/to/your/logfile.log # 指定慢查询日志的路径
3. 设置慢查询的阈值
默认情况下,超过10秒的查询会被记录为慢查询。但你可以根据实际需求调整这个阈值:
SET GLOBAL long_query_time = X; # X是你想设置的秒数
或在`my.cnf`中设置:
long_query_time = X
4. 开启全查询日志(非必须)
默认情况下,只有不使用索引的查询才会被记录。如果你想记录所有查询,可以设置:
SET GLOBAL log_queries_not_using_indexes = 'ON';
5. 查看慢查询日志
等待一段时间后,可以查看`/path/to/your/logfile.log`来定位慢查询。
6. 分析慢查询日志
你可以手动查看日志,或者使用工具如`mysqldumpslow`来帮助分析日志内容。
使用`mysqldumpslow`可以按照不同的维度(如执行时间、平均查询时长等)对慢查询进行排序和分析:
mysqldumpslow /path/to/your/logfile.log
7. 进一步的查询优化
在定位到具体的慢查询后,可以使用`EXPLAIN`语句来进一步分析查询执行计划,并基于此进行优化。
8. 定期轮转和清理慢查询日志
慢查询日志可能会很大,所以定期轮转和清理是很有必要的。你可以使用例如`logrotate`这样的工具来帮助管理日志文件。
二 可能导致慢查询的代码
1. 缺乏索引
-- 未对name列建索引SELECT * FROM users WHERE name = 'John';
2. 不适当的索引
假设存在一个first_name和last_name的复合索引,但没有单独的last_name索引SELECT * FROM users WHERE last_name = 'Doe';
3. 过多的JOIN操作
SELECT * FROM usersJOIN orders ON users.id = orders.user_idJOIN products ON orders.product_id = products.id... -- 更多JOIN
4. 子查询不当
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);
5. 选择了过多的数据
选择了所有列SELECT * FROM users;
6. 大量数据排序
如果没有为last_name建索引,此查询可能会很慢SELECT * FROM users ORDER BY last_name DESC;
7. 数据类型不匹配
假设id是INT类型SELECT * FROM users WHERE id = '12345';
8. 在索引列上使用函数
SELECT * FROM users WHERE LOWER(name) = 'john';
9. 锁竞争
START TRANSACTION;UPDATE users SET balance = balance - 100 WHERE id = 1; -- 这里可能被锁-- 另一个查询试图更新相同的行UPDATE users SET balance = balance + 100 WHERE id = 1;
10. 磁盘I/O限制
这主要是硬件问题,但例如,频繁的大型数据读取会导致磁盘I/O问题。
11. 查询设计不良
SELECT * FROM users WHERE age <> 30; -- 不使用索引
12. 数据库正处于高负载状态
不是代码问题,但当有大量的并发查询时,会导致慢查询。
13. 硬件限制
当服务器的CPU或RAM达到瓶颈时,查询可能会变慢。
14. 网络延迟
在分布式环境中,网络延迟会导致查询延迟。
15. 数据量过大
如果表中有数百万条记录,此查询可能会很慢SELECT COUNT(*) FROM large_table;
16. 查询中使用`OR`
SELECT * FROM users WHERE country = 'USA' OR state = 'California';
17. 临时表的使用
SELECT DISTINCT name FROM users ORDER BY age;
18. 磁盘空间不足
不是代码问题,但当硬盘空间不足时,写入操作可能会变慢。
19. 数据库配置不当
例如,配置了小的`innodb_buffer_pool_size`,导致频繁的磁盘I/O。
20. 没有合适的分区策略
SELECT * FROM large_table WHERE date = '2023-01-01'; -- 如果数据没有按日期分区
21. 使用了慢的存储引擎
例如,在MyISAM和InnoDB之间选择不当。
22. 没有合适的数据库设计
查询需要访问多个表,但数据可能可以存储在一个表中SELECT * FROM users, user_profiles WHERE users.id = user_profiles.user_id;
23. 外键约束
DELETE FROM users WHERE id = 1; -- 如果其他表有外键指向users表,可能导致延迟
24. 触发器的过度使用
创建了一个触发器,每次插入或更新`users`表时会执行额外的操作。
CREATE TRIGGER after_user_insert AFTER INSERT ON users FOR EACH ROWBEGIN-- 一些可能导致慢查询的操作END;
25. 复杂的视图
SELECT * FROM complex_view; -- 视图背后可能有多个表的JOIN操作
26. 避免使用存储过程
有些存储过程可能设计不当,导致效率问题。
27. 大量插入数据
INSERT INTO users (...) VALUES (...), (...), ...; -- 插入大量数据
28. 频繁的小批量操作
连续多次小批量操作,而不是批量插入或更新INSERT INTO users (name) VALUES ('John');INSERT INTO users (name) VALUES ('Jane');...
29. 没有考虑读写分离
所有查询(读和写)都在一个主数据库上执行,没有利用从数据库来分担读的负载。
30. 使用了太多的事务
START TRANSACTION;-- 一系列的查询COMMIT;
三 慢查询优化
优化MySQL慢查询通常涉及对查询、数据库结构、配置和有时是硬件的调整。以下是优化慢查询的一些建议和步骤:
1、使用EXPLAIN分析查询
使用EXPLAIN命令可以查看MySQL如何执行查询。这可以帮助你理解查询为什么慢,以及如何优化它。
EXPLAIN SELECT * FROM your_table WHERE your_conditions;
2、添加或调整索引
如果EXPLAIN显示查询正在进行全表扫描,考虑为WHERE子句中的字段添加索引。
考虑添加复合索引来优化涉及多个字段的查询条件。
使用COVERING索引减少数据查找次数。
3、优化查询结构
避免在WHERE子句中使用“!=”或“NOT IN”。
限制使用子查询,特别是在SELECT, FROM和WHERE子句中。
使用JOIN代替子查询。
4、避免在索引列上使用函数
如果你在索引列上使用函数,索引可能不会被使用。例如,避免这样的查询:
SELECT * FROM users WHERE UPPER(last_name) = 'SMITH';
5、减少查询数据的量
只选择你需要的列,而不是使用SELECT *。
使用LIMIT来限制结果的数量。
7、优化JOIN
总是为JOIN条件中的每个表的字段使用索引。
尽量减少使用左连接(LEFT JOIN)。
8、优化数据库结构
根据你的查询模式和数据访问模式对数据库进行正规化或反正规化。
考虑使用分区来分隔大表。
9、考虑读写分离
将读操作从写操作中分离,使主数据库处理写操作,而从数据库处理读操作。
10、定期维护
定期使用OPTIMIZE TABLE来优化表。
使用ANALYZE TABLE来更新表的统计信息。
相关文章:
MySQL慢查询优化、日志收集定位排查、慢查询sql分析
MySQL慢查询日志收集、定位,慢查询分析、排查。 一 MySQL慢查询定位 1. 确定是否已开启慢查询日志 查看慢查询日志是否已经被开启: SHOW VARIABLES LIKE slow_query_log; 如果返回值是OFF,你需要开启它。 2. 开启慢查询日志 你可以临时在运…...
HZOJ-266:表达式计算
题目描述 给出一个表达式,其中运算符仅包含 ,-,*,/,^ 要求求出表达式的最终值。 数据可能会出现括号情况,还有可能出现多余括号情况,忽略多余括号,正常计算即可; 数据保证不会出现大于 max long int 的数据࿱…...
JavaScript学习小结
变量声明:使用var关键字,变量没有类型,但值有类型(弱类型语言) 数据类型: ①number ②string(单引号,双引号都可以表示字符串) ③boolean ④Object类型 ⑤undefine…...
MySQL学习笔记13
DISTINCT数据去重: 案例:获取tb_student学生表学员年龄的分布情况。 mysql> select * from tb_student; ------------------------------------------------- | id | name | age | gender | address | --------------------------…...
怎么获取外网ip地址
在网络连接中,每个设备都被分配一个唯一的IP地址,用于标识和定位该设备。其中,内部或局域网IP地址是在局域网内使用的,而外网IP地址则是与公共互联网通信时所使用的地址。 获取外网IP地址对于许多人来说可能是一个常见的需求&…...
算法 只出现一次的两个数字-(哈希+异或)
牛客网: BM52 题目: 数组中仅2个数字出现1次,其余出现2次 思路: 出现2次的数字异或结果为0,另外两个不同的数字异或结果res不为0,异或结果的二进制位必与其中一个相同,求出二进制位为1的pos, 遍历数组,所有此位置为1…...
外卖霸王餐小程序、H5、公众号版外卖系统源码
最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码、霸王餐美团、饿了么系统,粉丝裂变玩源码下载,外卖cps小程序项目,外卖红包cps带好友返利佣金分销系统程序、饿了么美团联盟源码,外卖cps带分销返利后端源码,基于L…...
amlogic 机顶盒关闭DLNA 后,手机还能搜到盒子
S905L3 带有投屏的功能,并通过 com.droidlogic.mediacenter.dlna.MediaCenterService 服务的启动和停止来开启和关闭DLNA功能,但是在测试中发现机顶盒关闭DLNA后,手机还能搜索到盒子。我在复测中发现关闭后有时很难很久搜索到盒子,…...
@Autowire、@Recourse用啥?
在使用IDEA写Spring相关的项目的时候,在字段上使用Autowired注解时,总是会有一个波浪线提示:Field injection is not recommended. 这是为啥呢?今天就来一探究竟。 众所周知,在Spring里面有三种可选的注入方式…...
[linux] 过滤警告⚠️
如果你在Python脚本中输出和执行脚本文件时想要过滤掉警告信息,可以尝试以下方法: 使用warnings模块:导入warnings模块并设置warnings.filterwarnings("ignore"),这将会忽略所有的警告信息。在需要过滤警告的部分之前添…...
Linux必备操作系统命令大全
一、基础命令 pwd 命令 pwd命令用于显示当前所在的工作目录的全路径名称。该命令无需任何参数,只需在终端窗口中输入 pwd 命令即可使用。 cd 命令 cd命令用于更改当前工作目录。该命令需要一个参数:目标目录名称。例如,若要进入 Document…...
【rtp】VideoTimingExtension 扩展的解析和写入
VideoTimingExtension 扩展有13个字节,并非都是字符串类型 class VideoTimingExtension {public:using value_type = VideoSendTiming;static constexpr RTPExtensionType kId = kRtpExtensionVideoTiming;static constexpr uint8_t kValueSizeBytes = 13...
网络安全CTF比赛有哪些事?——《CTF那些事儿》告诉你
目录 前言 一、内容简介 二、读者对象 三、专家推荐 四、全书目录 前言 CTF比赛是快速提升网络安全实战技能的重要途径,已成为各个行业选拔网络安全人才的通用方法。但是,本书作者在从事CTF培训的过程中,发现存在几个突出的问题࿱…...
Winform直接与Wpf交互
Winform项目中,可以直接使用wpf中的自定义控件和窗体 测试环境: vistual studio 2017 window 10 一 winform直接使用wpf的自定义控件 步骤如下: 1 新建winfrom项目,名为WinFormDemo,默认有一个名为Form1的窗体…...
Uni-app 调用微信地图导航功能【有图】
前言 我们在使用uni-app时,有时候会遇到需要开发地图和导航的功能,这些方法其实微信小程序的API已经帮我们封装好了 详见:微信小程序开发文档 接下来我们就演示如何用uni-app来使用他们 使用 <template><view><button type…...
Golang slice 通过growslice调用nextslicecap计算扩容
先来看一段代码 code: e : []int64{1, 2, 3}fmt.Println("cap of e before:", cap(e))e append(e, 4, 5, 6, 7)fmt.Println("cap of e after:", cap(e))output:cap of e before: 3 cap of e after: 8 为什么容量是8? append了的4个元素&…...
HTTP 协商缓存 Last-Modified,If-Modified-Since
浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone header加上Last-Modified属性(表示这个资源在服务器上的最后修改时间): ----------------------------------------------------------------…...
零基础教程:Yolov5模型改进-添加13种注意力机制
1.准备工作 先给出13种注意力机制的下载地址: https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例(不需要接收通道数的注意力机制) 1.在models文件下新建py文件,取名叫Sim…...
vue截取地址参数
const getQueryValueFn () >{// 获取当前页面的URLconst currentURL window.location.href;//创建一个URL对象来解析当前URL。URL对象提供了方便的属性和方法来处理URL的各个部分const url new URL(currentURL);// 使用URLSearchParams获取查询参数const queryParams ne…...
ubuntu 14.04更新GCC版本
按最基本的apt-get install gcc-8,不成功,提示如下。 按网上说的:apt-get update ,apt-get upgrade 后都无效果。 apt-cache search get 搜索后,发现资源链接里最新的也只有4.8.4所以不行。 需要更新资源链接,镜像地…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
