当前位置: 首页 > news >正文

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 = 1 slow_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 users    JOIN orders ON users.id = orders.user_id    JOIN 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 ROW     BEGIN        -- 一些可能导致慢查询的操作    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慢查询日志收集、定位&#xff0c;慢查询分析、排查。 一 MySQL慢查询定位 1. 确定是否已开启慢查询日志 查看慢查询日志是否已经被开启&#xff1a; SHOW VARIABLES LIKE slow_query_log; 如果返回值是OFF&#xff0c;你需要开启它。 2. 开启慢查询日志 你可以临时在运…...

HZOJ-266:表达式计算

题目描述 ​ 给出一个表达式,其中运算符仅包含 ,-,*,/,^ 要求求出表达式的最终值。 ​ 数据可能会出现括号情况&#xff0c;还有可能出现多余括号情况&#xff0c;忽略多余括号&#xff0c;正常计算即可&#xff1b; ​ 数据保证不会出现大于 max long int 的数据&#xff1…...

JavaScript学习小结

变量声明&#xff1a;使用var关键字&#xff0c;变量没有类型&#xff0c;但值有类型&#xff08;弱类型语言&#xff09; 数据类型&#xff1a; ①number ②string&#xff08;单引号&#xff0c;双引号都可以表示字符串&#xff09; ③boolean ④Object类型 ⑤undefine…...

MySQL学习笔记13

DISTINCT数据去重&#xff1a; 案例&#xff1a;获取tb_student学生表学员年龄的分布情况。 mysql> select * from tb_student; ------------------------------------------------- | id | name | age | gender | address | --------------------------…...

怎么获取外网ip地址

在网络连接中&#xff0c;每个设备都被分配一个唯一的IP地址&#xff0c;用于标识和定位该设备。其中&#xff0c;内部或局域网IP地址是在局域网内使用的&#xff0c;而外网IP地址则是与公共互联网通信时所使用的地址。 获取外网IP地址对于许多人来说可能是一个常见的需求&…...

算法 只出现一次的两个数字-(哈希+异或)

牛客网: BM52 题目: 数组中仅2个数字出现1次&#xff0c;其余出现2次 思路: 出现2次的数字异或结果为0&#xff0c;另外两个不同的数字异或结果res不为0&#xff0c;异或结果的二进制位必与其中一个相同&#xff0c;求出二进制位为1的pos, 遍历数组&#xff0c;所有此位置为1…...

外卖霸王餐小程序、H5、公众号版外卖系统源码

最新外卖霸王餐小程序、H5、微信公众号版外卖系统源码、霸王餐美团、饿了么系统&#xff0c;粉丝裂变玩源码下载&#xff0c;外卖cps小程序项目&#xff0c;外卖红包cps带好友返利佣金分销系统程序、饿了么美团联盟源码&#xff0c;外卖cps带分销返利后端源码&#xff0c;基于L…...

amlogic 机顶盒关闭DLNA 后,手机还能搜到盒子

S905L3 带有投屏的功能&#xff0c;并通过 com.droidlogic.mediacenter.dlna.MediaCenterService 服务的启动和停止来开启和关闭DLNA功能&#xff0c;但是在测试中发现机顶盒关闭DLNA后&#xff0c;手机还能搜索到盒子。我在复测中发现关闭后有时很难很久搜索到盒子&#xff0c…...

@Autowire、@Recourse用啥?

在使用IDEA写Spring相关的项目的时候&#xff0c;在字段上使用Autowired注解时&#xff0c;总是会有一个波浪线提示&#xff1a;Field injection is not recommended. 这是为啥呢&#xff1f;今天就来一探究竟。 众所周知&#xff0c;在Spring里面有三种可选的注入方式&#xf…...

[linux] 过滤警告⚠️

如果你在Python脚本中输出和执行脚本文件时想要过滤掉警告信息&#xff0c;可以尝试以下方法&#xff1a; 使用warnings模块&#xff1a;导入warnings模块并设置warnings.filterwarnings("ignore")&#xff0c;这将会忽略所有的警告信息。在需要过滤警告的部分之前添…...

Linux必备操作系统命令大全

一、基础命令 pwd 命令 pwd命令用于显示当前所在的工作目录的全路径名称。该命令无需任何参数&#xff0c;只需在终端窗口中输入 pwd 命令即可使用。 cd 命令 cd命令用于更改当前工作目录。该命令需要一个参数&#xff1a;目标目录名称。例如&#xff0c;若要进入 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比赛是快速提升网络安全实战技能的重要途径&#xff0c;已成为各个行业选拔网络安全人才的通用方法。但是&#xff0c;本书作者在从事CTF培训的过程中&#xff0c;发现存在几个突出的问题&#xff1…...

Winform直接与Wpf交互

Winform项目中&#xff0c;可以直接使用wpf中的自定义控件和窗体 测试环境&#xff1a; vistual studio 2017 window 10 一 winform直接使用wpf的自定义控件 步骤如下&#xff1a; 1 新建winfrom项目&#xff0c;名为WinFormDemo&#xff0c;默认有一个名为Form1的窗体…...

Uni-app 调用微信地图导航功能【有图】

前言 我们在使用uni-app时&#xff0c;有时候会遇到需要开发地图和导航的功能&#xff0c;这些方法其实微信小程序的API已经帮我们封装好了 详见&#xff1a;微信小程序开发文档 接下来我们就演示如何用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&#xff1f; append了的4个元素&…...

HTTP 协商缓存 Last-Modified,If-Modified-Since

浏览器第一次跟服务器请求一个资源&#xff0c;服务器在返回这个资源的同时&#xff0c;在respone header加上Last-Modified属性&#xff08;表示这个资源在服务器上的最后修改时间&#xff09;&#xff1a; ----------------------------------------------------------------…...

零基础教程:Yolov5模型改进-添加13种注意力机制

1.准备工作 先给出13种注意力机制的下载地址&#xff1a; https://github.com/z1069614715/objectdetection_script 2.加入注意力机制 1.以添加SimAM注意力机制为例&#xff08;不需要接收通道数的注意力机制&#xff09; 1.在models文件下新建py文件&#xff0c;取名叫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&#xff0c;不成功&#xff0c;提示如下。 按网上说的&#xff1a;apt-get update ,apt-get upgrade 后都无效果。 apt-cache search get 搜索后&#xff0c;发现资源链接里最新的也只有4.8.4所以不行。 需要更新资源链接&#xff0c;镜像地…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...