关于数据库的慢查询

1.数据库的慢查询

慢查询是指执行时间超过预设阈值的数据库查询操作。它是数据库性能优化的一个重要指标和切入点。

慢查询的主要特点

  1. 执行时间长:超过了数据库系统设定的慢查询阈值(如MySQL默认是10秒)

  2. 资源消耗大:可能占用大量CPU、内存或I/O资源

  3. 影响整体性能:会拖慢整个数据库系统的响应速度

慢查询的常见原因

  1. 缺少合适的索引:没有为查询条件建立索引或索引设计不合理

  2. SQL语句编写不佳:如使用SELECT *、复杂的子查询、不必要的JOIN操作等

  3. 大数据量操作:单次查询处理大量数据

  4. 锁竞争:查询被其他事务阻塞

  5. 数据库设计问题:表结构设计不合理,如缺少必要的字段或过度规范化

如何识别慢查询

  1. 数据库日志:MySQL的slow query log

  2. 监控工具:如Percona PMM、Datadog等

  3. EXPLAIN分析:查看查询执行计划

  4. 性能模式:MySQL的performance_schema

慢查询优化方法

  1. 添加适当索引:基于查询条件创建合适的索引

  2. 重写SQL:简化复杂查询,避免全表扫描

  3. 分页处理:大数据量查询使用LIMIT分页

  4. 数据库调优:调整数据库配置参数

  5. 缓存策略:对频繁查询但不常变的数据使用缓存

慢查询分析是数据库性能优化的基础工作,定期检查和优化慢查询可以显著提升数据库整体性能。

2.关于查询阈值

数据库慢查询的预设阈值(即执行时间超过多少秒算作慢查询)并没有统一标准,主要取决于业务需求、数据库类型和性能要求。以下是常见场景的参考值:


1. 默认阈值(不同数据库)

数据库类型默认阈值配置参数
MySQL10秒long_query_time
PostgreSQL无默认值(需手动设置)log_min_duration_statement
SQL Server无默认值(通过扩展事件/XEvent配置)-
Oracle无默认值(通过AWR/ASH报告分析)DBMS_MONITOR

2. 实际业务中的建议阈值

  • OLTP系统(高并发交易场景): 100ms~1s
    (如电商、支付系统,要求快速响应)

  • OLAP系统(分析型查询): 5s~10s
    (如报表查询,允许更长时间)

  • 内部管理后台1s~3s
    (对用户体验要求较低的场景)


3. 如何设置合理阈值?

  1. 基准测试:通过压测工具(如Sysbench、JMeter)观察正常查询的响应时间分布。

  2. 业务需求:根据用户可容忍的等待时间调整(如API响应SLA要求)。

  3. 渐进调整

    • 从严格阈值开始(如1秒),逐步放宽并观察影响。

    • 示例(MySQL):

      -- 临时设置为1秒
      SET GLOBAL long_query_time = 1;
      -- 永久生效需修改my.cnf

4. 注意事项

  • 避免过严:阈值太小会导致日志爆炸,难以分析真正问题。

  • 动态调整:高峰期可适当放宽阈值,低峰期收紧。

  • 结合其他指标
    即使未超阈值,但高频执行的查询(如每秒100次×200ms)也可能需要优化。


5. 扩展工具

  • MySQL

    -- 查看当前阈值
    SHOW VARIABLES LIKE 'long_query_time';
    -- 启用慢查询日志
    SET GLOBAL slow_query_log = 'ON';
  • PostgreSQL

    -- 设置记录超过500ms的查询
    ALTER SYSTEM SET log_min_duration_statement = 500;

根据实际场景灵活调整阈值,并配合监控工具(如Prometheus + Grafana)长期观察趋势。

3.慢查询场景分析

一、索引优化策略

1. 添加缺失索引

案例:用户表无索引导致查询缓慢

-- 优化前(耗时1200ms)
SELECT * FROM users WHERE username = 'john_doe';-- 优化后(添加索引,耗时5ms)
ALTER TABLE users ADD INDEX idx_username(username);
SELECT * FROM users WHERE username = 'john_doe';

2. 复合索引优化

案例:多条件查询效率低

-- 优化前(全表扫描,耗时800ms)
SELECT * FROM orders 
WHERE user_id = 100 AND status = 'completed' AND create_time > '2023-01-01';-- 优化后(创建复合索引,耗时15ms)
ALTER TABLE orders ADD INDEX idx_user_status_time(user_id, status, create_time);

二、SQL语句优化策略

1. 避免SELECT *

案例:查询不需要的列

-- 优化前(返回所有列,耗时450ms)
SELECT * FROM products WHERE category = 'electronics';-- 优化后(只查询必要列,耗时120ms)
SELECT product_id, product_name, price FROM products WHERE category = 'electronics';

2. 分页优化

案例:大数据量分页

-- 优化前(LIMIT深分页,耗时1500ms)
SELECT * FROM logs ORDER BY id LIMIT 100000, 20;-- 优化后(使用游标分页,耗时30ms)
SELECT * FROM logs WHERE id > 100000 ORDER BY id LIMIT 20;

三、JOIN优化策略

1. 小表驱动大表

案例:JOIN顺序不当

-- 优化前(大表驱动小表,耗时3200ms)
SELECT * FROM large_table l JOIN small_table s ON l.id = s.large_id;-- 优化后(小表驱动大表,耗时400ms)
SELECT * FROM small_table s JOIN large_table l ON s.large_id = l.id;

2. 避免笛卡尔积

案例:缺少JOIN条件

-- 优化前(产生笛卡尔积,耗时15秒)
SELECT * FROM table_a, table_b WHERE table_a.status = 1;-- 优化后(明确JOIN条件,耗时200ms)
SELECT * FROM table_a JOIN table_b ON table_a.id = table_b.a_id WHERE table_a.status = 1;

四、子查询优化策略

1. 用JOIN替代子查询

案例:IN子查询效率低

-- 优化前(子查询,耗时800ms)
SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);-- 优化后(使用JOIN,耗时150ms)
SELECT u.* FROM users u JOIN orders o ON u.id = o.user_id WHERE o.amount > 1000;

2. EXISTS替代IN

案例:大数据集IN查询

-- 优化前(IN列表过长,耗时5秒)
SELECT * FROM products WHERE id IN (1,3,5,...,10000);-- 优化后(使用EXISTS,耗时300ms)
SELECT p.* FROM products p WHERE EXISTS (SELECT 1 FROM product_ids pi WHERE pi.id = p.id);

五、函数和类型转换优化

1. 避免索引列使用函数

案例:函数导致索引失效

-- 优化前(索引失效,耗时1200ms)
SELECT * FROM orders WHERE DATE(create_time) = '2023-01-01';-- 优化后(使用范围查询,耗时50ms)
SELECT * FROM orders WHERE create_time >= '2023-01-01' AND create_time < '2023-01-02';

2. 类型匹配优化

案例:隐式类型转换

-- 优化前(varchar和int比较,耗时800ms)
SELECT * FROM products WHERE product_code = 12345;-- 优化后(类型一致,耗时30ms)
SELECT * FROM products WHERE product_code = '12345';

六、数据库配置优化

1. 调整慢查询阈值

-- MySQL设置慢查询阈值为1秒
SET GLOBAL long_query_time = 1;

2. 启用慢查询日志

-- MySQL启用慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL log_queries_not_using_indexes = 'ON';

七、执行计划分析

1. EXPLAIN分析

-- 查看查询执行计划
EXPLAIN SELECT * FROM users WHERE username = 'john_doe';

2. 优化器提示

-- 强制使用特定索引
SELECT * FROM users FORCE INDEX(idx_username) WHERE username = 'john_doe';

八、其他高级优化

1. 分区表优化

-- 按时间范围分区
ALTER TABLE logs PARTITION BY RANGE (YEAR(create_time)) (PARTITION p2022 VALUES LESS THAN (2023),PARTITION p2023 VALUES LESS THAN (2024)
);

2. 物化视图

-- 创建汇总表
CREATE MATERIALIZED VIEW sales_summary AS
SELECT product_id, SUM(amount) as total_sales
FROM orders
GROUP BY product_id;

以上案例中的耗时数据是基于典型生产环境的近似值,实际性能提升效果会因数据量、硬件配置和数据库版本等因素而有所不同。建议在实际环境中使用EXPLAIN分析并结合数据库监控工具进行验证。

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

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

相关文章

【Rust日报】 Python 核心开发者对 Rust 的期望

半月刊&#xff1a;The Embedded Rustacean Issue #49亮点&#xff1a;&#x1f4e2; 乐鑫 DevCon 2025 演讲嘉宾征集&#x1f9ba; CISA 和 NSA 参与内存安全对话&#x1f510; 微软宣布 RIFT &#xff08;Rust 恶意软件分析工具&#xff09;&#x1f4b0;️ Nordic 收购 Memf…

vue是什么

Vue简介Vue&#xff08;Vue.js&#xff09;是一个用于构建用户界面的渐进式JavaScript框架。它专注于视图层&#xff0c;易于集成到现有项目中&#xff0c;也可用于开发复杂的单页面应用&#xff08;SPA&#xff09;。Vue的核心特点是轻量、灵活和高效&#xff0c;通过数据绑定…

10分钟掌握 Nginx 配置文件结构

在实际部署前端或后端项目时&#xff0c;Nginx 配置文件&#xff08;nginx.conf&#xff09; 是我们无法绕开的第一道门槛。 本文将带你用10分钟掌握 nginx.conf 的核心结构与常见配置方法&#xff0c;并提供一篇完整的实战文档链接&#xff0c;适合初学者快速掌握。 &#x1…

典型的前后端交互数据示例

提供几种典型的前后端交互数据示例&#xff1a; 前端如何组织数据&#xff0c;以及后端如何接收数据。 文章目录1. POST请求后端实体类接收前端js后端接收结果查看2. GET请求后端实体类接收前端js后端接收结果查看3. GET请求后端基本类型接收前端js后端接收结果查看1. POST请求…

计算机毕业设计springboot影视周边推荐系统 基于SpringBoot的电影衍生品智能推荐平台 JavaWeb实现的影视文化周边个性化服务系统

计算机毕业设计springboot影视周边推荐系统6c31q9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。疫情之后&#xff0c;线上娱乐需求激增&#xff0c;人们对电影及其衍生商品的关…

(4)机器学习小白入门YOLOv :图片标注实操手册

(1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 (4)机器学习小白入门YOLOv &#xff1a;图片标注实操手册 (5)机器学习小白入门 YOLOv&#xff1a;…

【JMeter】调试方法

文章目录取样器&#xff1a;发送请求、接收响应>>察看结果树断言&#xff1a;验证响应>>察看结果树提取器&#xff1a;创建变量>>调试取样器自定义断言&#xff1a;代码>>日志了解JMeter的内部细节&#xff0c;排查错误的原因。取样器&#xff1a;发送…

Vue框架之钩子函数详解

Vue框架之生命周期主要钩子函数详解一、Vue生命周期的整体流程二、创建阶段&#xff1a;初始化组件实例2.1 beforeCreate&#xff1a;实例创建前2.2 created&#xff1a;实例创建后三、挂载阶段&#xff1a;组件与DOM结合3.1 beforeMount&#xff1a;挂载前3.2 mounted&#xf…

Syntax Error: TypeError: Cannot set properties of undefined (setting ‘parent‘)

Date: 2025-07-12 19:21:24 author: lijianzhan使用npm run dev运行前端项目时报错&#xff0c;具体报错信息如下&#xff1a; ERROR Failed to compile with 1 error …

JAVA后端开发——类命名规范

引言良好的命名规范是软件工程的基石。它不仅能提升代码的可读性&#xff0c;还能降低团队协作的沟通成本&#xff0c;使项目在长期迭代中更易于维护。本规范结合了业界主流实践&#xff08;如阿里巴巴Java开发手册&#xff09;以及现代Web应用分层架构的特点&#xff0c;旨在提…

Ubuntu2404修改国内镜像

文章目录1 备份原文件2 修改文件内容Ubuntu2404修改国内镜像 2404和2204修改镜像的方式不一致 且镜像保存的位置也不一致&#xff0c;位置在/etc/apt/source.list.d/ubuntu.sources 参考&#xff1a;https://blog.csdn.net/Kiffy_Yam/article/details/145876447 1 备份原文件…

Chrome拓展 Video Speed Controller 等内嵌恶意后门

【高危】Chrome拓展 Video Speed Controller 等内嵌恶意后门 漏洞描述 当用户安装受影响版本的 Video Speed Controller 等Chrome拓展会窃取用户的浏览链接&#xff0c;并与攻击者可控的C2地址建立持久化连接&#xff0c;攻击者可将用户浏览器重定向到恶意网站。 MPS编号MPS…

Spring Ai Alibaba Gateway 实现存量应用转 MCP 工具

作者简介&#xff1a;你好&#xff0c;我是影子&#xff0c;Spring Ai Alibaba开源社区 Committer&#xff0c;持续分享Spring Ai Alibaba最新进展 业界各类AI工程相关的方案 最近有断时间没更了&#xff0c;熟悉我的朋友知道我刚结束完毕业旅行&#xff0c;最近也因为入职&a…

HTTP和HTTPS部分知识点

HTTP基本概念 超文本-传输-协议 协议 HTTP是一个用在计算机世界里的协议。它使用计算机可以理解的语言确立了一种计算机之间交流通信的规范(两个以上的参与者)&#xff0c;以及相关的各种控制和错误处理方式(行为约定和规范)。传输 HTTP协议是一个双向协议。是一个在计算机世界…

第10讲——一元函数积分学的几何应用

文章目录定积分计算平面图形的面积直角坐标系下参数方程下极坐标系下定积分计算旋转体的体积曲边梯形绕x轴旋转一周所得到的旋转体的体积曲边梯形绕y轴旋转一周所得到的旋转体的体积平面曲线绕定直线旋转定积分计算函数的平均值定积分计算平面光滑曲线的弧长曲线L绕x轴旋转一周…

Go从入门到精通(20)-一个简单web项目-服务搭建

Go从入门到精通&#xff08;15&#xff09;-包&#xff08;package&#xff09; Go从入门到精通&#xff08;9&#xff09;-函数 文章目录Go从入门到精通&#xff08;15&#xff09;-包&#xff08;package&#xff09;Go从入门到精通&#xff08;9&#xff09;-函数前言gogin…

Python爬虫实战:研究python-docx库相关技术

1. 引言 1.1 研究背景与意义 随着学术资源数字化程度的提高,科研工作者面临海量文献数据的筛选与分析挑战。传统人工调研方式效率低下,难以全面捕捉研究领域的动态趋势。自动化文献分析系统能够通过爬虫技术快速采集多源数据,并通过文本挖掘提取关键信息,为研究方向选择、…

Django中序列化与反序列化

1&#xff1a;序列化&#xff1a;将数据结构或对象状态转换为可以存储或传输的格式&#xff08;如JSON、XML&#xff09;的过程。在Web开发中&#xff0c;通常是将模型实例&#xff08;或查询集&#xff09;转换为JSON格式&#xff0c;以便通过HTTP响应发送给客户端。序列化&am…

【离线数仓项目】——电商域DWD层开发实战

摘要本文主要介绍了离线数仓项目中电商域DWD层的开发实战。DWD层是数据仓库架构中的明细数据层&#xff0c;对ODS层的原始数据进行清洗、规范、整合与业务建模。它具有数据清洗、标准化、业务建模、整合、维度挂载等作用&#xff0c;常见设计特征包括一致性、明细级建模、保留历…

爬虫-正则使用

1.模块选择用re模块导入&#xff0c;&#xff0c;最前面加个r&#xff0c;就不用怕转义了2.模块使用re.findall使用结果是数组方式呈现re.finditer把结果变成迭代器&#xff0c;从迭代器类中间取数re.searchre.search 只能匹配到第一个识别到的内容re.match3.推荐写法先预加载完…