關于數據庫的慢查詢

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
英文地址,請注明出處:http://en.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.推薦寫法先預加載完…