MySQL 慢查詢優化指南

MySQL 慢查詢優化指南

在現代數據庫管理中,性能優化是一個不可忽視的重要環節。尤其是對于高并發、大數據量的應用,慢查詢可能會成為系統的性能瓶頸。本文將介紹如何查看和優化 MySQL 的慢查詢,幫助你提高數據庫性能。

一、什么是慢查詢?

慢查詢是指執行時間超過指定閾值的 SQL 查詢。在 MySQL 中,可以通過設置 long_query_time 參數來定義這個閾值,默認值為 10 秒。通過啟用慢查詢日志,我們可以記錄這些執行時間過長的查詢,以便進行分析和優化。

二、啟用慢查詢日志

首先,需要確保 MySQL 已啟用慢查詢日志。可以通過以下命令查看當前配置:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

如果未啟用,可以通過修改 MySQL 配置文件(通常為 my.cnfmy.ini)來開啟慢查詢日志,并設置查詢時間閾值:

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

然后,重啟 MySQL 服務使配置生效:

sudo systemctl restart mysql
三、查看慢查詢日志

可以通過登錄到數據庫服務器,使用文本編輯器(如 vinano)查看慢查詢日志文件:

sudo vi /var/log/mysql/slow.log

也可以使用以下 SQL 命令在 MySQL 客戶端中直接查看慢查詢日志的數量:

SHOW GLOBAL STATUS LIKE 'Slow_queries';
四、分析慢查詢日志

假設我們在慢查詢日志中發現以下記錄:

# Time: 2023-05-16T10:12:34.567890Z
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 12.345678  Lock_time: 0.000123 Rows_sent: 100  Rows_examined: 1000000
SET timestamp=1684230754;
SELECT * FROM orders WHERE status = 'PENDING' AND created_at < '2023-05-01' ORDER BY created_at DESC;
五、優化慢查詢

我們需要從以下幾個方面來優化這條慢查詢:

  1. 檢查表結構和索引: 查看 orders 表的結構,尤其是索引情況:

    SHOW CREATE TABLE orders;
    

    輸出結果:

    CREATE TABLE `orders` (
    `id` int NOT NULL AUTO_INCREMENT,
    `user_id` int NOT NULL,
    `status` varchar(50) NOT NULL,
    `created_at` datetime NOT NULL,
    `total_amount` decimal(10,2) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `idx_user_id` (`user_id`),
    KEY `idx_status` (`status`),
    KEY `idx_created_at` (`created_at`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    
  2. 添加適當的索引: 通過分析查詢條件和排序需求,添加復合索引以提高查詢效率:

    ALTER TABLE orders ADD INDEX idx_status_created_at (status, created_at);
    
  3. 使用 EXPLAIN 命令: 執行優化后的查詢,查看執行計劃:

    EXPLAIN SELECT * FROM orders WHERE status = 'PENDING' AND created_at < '2023-05-01' ORDER BY created_at DESC;
    

    假設 EXPLAIN 輸出如下:

    +----+-------------+--------+------------+-------+---------------+------------------------+---------+------+-------+-------------+
    | id | select_type | table  | partitions | type  | possible_keys | key                    | key_len | ref  | rows  | Extra       |
    +----+-------------+--------+------------+-------+---------------+------------------------+---------+------+-------+-------------+
    |  1 | SIMPLE      | orders | NULL       | ref   | idx_status_created_at | idx_status_created_at | 767     | const| 1000  | Using where |
    +----+-------------+--------+------------+-------+---------------+------------------------+---------+------+-------+-------------+
    

    通過 EXPLAIN 輸出,可以看到查詢計劃使用了我們新添加的索引 idx_status_created_at,并且 typeref,說明索引查找相對高效。

以下是 EXPLAIN 命令輸出中 type 列的各個等級及其含義,以表格的形式展示:

Type含義性能示例
system表僅有一行(系統表)。最理想SELECT * FROM dual;
const表中最多有一行匹配查詢條件,通常是通過主鍵或唯一索引來查找。非常快速SELECT * FROM table WHERE primary_key = 1;
eq_ref對每個從表的記錄,主表中只有一條匹配記錄。良好SELECT * FROM table1 JOIN table2 ON table1.primary_key = table2.foreign_key;
ref對于從表的每一行,從主表中匹配到多行。較好SELECT * FROM table WHERE indexed_column = 'value';
ref_or_null類似于 ref,但還包括了對 NULL 值的檢查。較好SELECT * FROM table WHERE indexed_column = 'value' OR indexed_column IS NULL;
index_merge查詢使用了多個索引的合并。SELECT * FROM table WHERE indexed_column1 = 'value1' OR indexed_column2 = 'value2';
range只檢索表中給定范圍的行,使用索引查找。一般SELECT * FROM table WHERE indexed_column BETWEEN 10 AND 20;
index全索引掃描,類似全表掃描,但只掃描索引樹。一般SELECT indexed_column FROM table;
all全表掃描。最差SELECT * FROM table;

在實際應用中,通過理解和優化 EXPLAIN 輸出中的 type 類型,能夠顯著提高查詢性能。對于性能要求高的查詢,應該盡量避免使用 typeallindex,并盡量使用索引以提高查詢效率。

  1. 檢查查詢性能: 再次執行查詢,檢查執行時間是否明顯減少。如果查詢性能仍然不理想,可以考慮進一步優化查詢邏輯或重新設計表結構。
六、進一步優化建議
  • 優化查詢邏輯: 重新評估查詢邏輯,確保沒有不必要的復雜性。例如,避免在 WHERE 子句中使用不必要的函數調用或復雜表達式。
  • 拆分查詢: 如果數據量非常大,可以考慮將查詢拆分成多個小查詢,分批處理。例如,使用分頁技術(LIMIT 和 OFFSET)分批讀取數據。
  • 優化表設計: 重新設計表結構,避免過多的復雜性。確保數據存儲和訪問的高效性。例如,規范化表設計,避免冗余數據。
七、總結

通過啟用和分析慢查詢日志,我們可以有效地識別和解決 MySQL 慢查詢問題。優化慢查詢通常需要檢查表結構、添加適當的索引、優化查詢邏輯,以及必要時重新設計表結構。通過這些步驟,可以顯著提高數據庫性能,確保系統的高效運行。

希望這篇博客能幫助你理解和優化 MySQL 慢查詢。如果你有任何問題或建議,歡迎在評論區留言。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18450.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言 | Leetcode C語言題解之第118題楊輝三角

題目&#xff1a; 題解&#xff1a; int** generate(int numRows, int* returnSize, int** returnColumnSizes) {int** ret malloc(sizeof(int*) * numRows);*returnSize numRows;*returnColumnSizes malloc(sizeof(int) * numRows);for (int i 0; i < numRows; i) {re…

C#實現計算數據和刷新ListView列表并發執行

下面是一個示例代碼&#xff0c;演示如何在C#中實現計算列表的數據和刷新ListView控件的數據的并發執行&#xff1a; using System; using System.Collections.Generic; using System.Threading; using System.Windows.Forms;class Program {static List<int> dataList …

前端API: IntersectionObserver的那一二三件事

IntersectionObserver 基礎 IntersectionObserver 可以監聽一個元素和可視區域相交部分的比例&#xff0c;然后在可視比例達到某個閾值的時候觸發回調。比如可以用來處理圖片的懶加載等等 首先我們來看下基本的格式&#xff1a; const observer new IntersectionObserver(c…

yolov10 使用自己的數據集訓練目標檢測模型

1 環境配置(使用anaconda) conda create -n yolov10 python=3.9 //創建虛擬環境 conda activate yolov10 //激活虛擬環境 pip install -r requirements.txt //執行yolov10 路徑下requirements.txt 安裝依賴 pip install -e .2.數據集制作 使用lableImage制作數據集(win版…

華為云Astro Zero低代碼平臺案例:小、輕、快、準助力銷售作戰數字化經營

客戶背景&#xff1a; 隨著業務的不斷擴展&#xff0c;華為云某一線作戰團隊發現&#xff0c;原本基于線上Excel的項目跟蹤方式面臨新的挑戰&#xff1a;多區域、多場景下的業務管理越來越復雜&#xff0c;項目管道存在多種不可控因素&#xff0c;客戶關系、進展跟蹤同步不及時…

【Qt秘籍】[003]-Qt環境變量配置-磨刀不誤砍柴工

一、為什么要設置環境變量 &#xff1f;[原因] 配置PATH環境變量的主要用處在于讓操作系統能夠識別并執行不在當前工作目錄下的可執行文件。具體來說&#xff0c;它的作用包括&#xff1a; 命令執行便捷性&#xff1a;當你在命令行輸入一個命令&#xff08;如java, python或np…

【Unity程序】Unity游戲開發中常用的設計模式【一】

&#x1f468;?&#x1f4bb;個人主頁&#xff1a;元宇宙-秩沅 &#x1f468;?&#x1f4bb; hallo 歡迎 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;?&#x1f4bb; 本文由 秩沅 原創 &#x1f468;?&#x1f4bb; 收錄于專欄&#xff1a;Uni…

【C語言習題】26.字符逆序

文章目錄 1.描述2.解題思路3.具體代碼 1.描述 輸入描述: 將一個字符串str的內容顛倒過來&#xff0c;并輸出。可以有空格 數據范圍&#xff1a;1≤&#x1d459;&#x1d452;&#x1d45b;(&#x1d460;&#x1d461;&#x1d45f;)≤10000 1≤len(str)≤10000 輸出描述&…

Android基礎-數據庫

在Android系統中&#xff0c;數據庫扮演著至關重要的角色&#xff0c;它負責存儲、管理和檢索應用程序所需的數據。隨著移動應用的日益復雜和功能的不斷增加&#xff0c;對數據庫的需求也日益提高。在Android中&#xff0c;有多種數據庫管理系統和工具可供選擇&#xff0c;其中…

NDIS協議驅動(四)

NDIS 定義對象標識符 (OID) 值&#xff0c;以標識適配器參數&#xff0c;其中包括設備特征、可配置設置和統計信息等操作參數。 協議驅動程序可以查詢或設置基礎驅動程序的操作參數。 NDIS 還為 NDIS 6.1 及更高版本的協議驅動程序提供直接 OID 請求接口。 直接 OID 請求路徑支…

利用EasyCVR視頻智能監控技術,構建智慧化考場監管體系

隨著科技的進步&#xff0c;視頻監控在各個領域的應用越來越廣泛&#xff0c;其中在考場中的應用尤為顯著。視頻監控不僅能夠提高考場的監管水平&#xff0c;確保考試的公平、公正和公開&#xff0c;還能有效預防和打擊作弊行為&#xff0c;為考生營造一個良好的考試環境。 傳…

前后端分離跨域問題解決方案

Vue和SpringBoot的跨域問題的4中解決方案 跨域問題產生的原因&#xff1a;瀏覽器的保護機制&#xff0c;同源策略協議&#xff0c;域名&#xff0c;端口&#xff1b;三個中有一個不同就會產生跨域問題 解決方案&#xff08;后端&#xff09;&#xff1a; 1.CrossOrigin注解&…

界面控件DevExtreme v23.2亮點 - 標簽、表單、編輯器功能升級

DevExtreme擁有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用現代Web開發堆棧&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;構建交互式的Web應用程序。從Angular和Reac&#xff0c…

腦圖工具 在學習系統架構中的使用

系統&#xff0c;有人把它比作一個黑盒&#xff0c;有人比作一個樹洞。呃&#xff0c;其實二者都隱含的表達了一個意思&#xff0c;盤根錯節&#xff0c;一言難盡&#xff0c;欲說還休&#xff0c;說了又像是隔靴搔癢&#xff0c;感覺沒說透。 學習&#xff0c;理解和展示一個…

計算機組成原理----移碼

在網上搜索移碼是什么,大概率會搜到一個結論:移碼是補碼符號位取反,可是真的是這樣嗎? 傳統的有符號整數是將二進制數的首位作為符號位,0表示正數,1表示負數。 但在移碼中,我們不再使用單獨的符號位來表示正負。而是通過一個固定的偏置量來將所有可能的指數值映射到一個無符…

力扣每日一題 5/28

題目&#xff1a;2951-找出峰值 給你一個下標從 0 開始的數組 mountain 。你的任務是找出數組 mountain 中的所有 峰值。 以數組形式返回給定數組中 峰值 的下標&#xff0c;順序不限 。 注意&#xff1a; 峰值 是指一個嚴格大于其相鄰元素的元素。數組的第一個和最后一個元…

C語言.順序表.通訊錄

基于順序表示實現通訊錄 1.通訊錄項目的功能要求2.代碼實現3.頭文件處理4.通訊錄的具體實現4.1通訊錄的初始化與銷毀4.1.1通訊錄的初始化4.1.2通訊錄的初始化銷毀 4.2通訊錄的添加與刪除數據4.2.1通訊錄的添加數據4.2.1通訊錄的刪除數據 4.3通訊錄的修改4.4通訊錄的查找4.5通訊…

熟悉電腦快捷鍵(包含部分VS)

有很多不太電腦的小白&#xff0c;這里給大家一些常用快捷鍵&#xff0c;希望幫助到大家學習~ ctrl c 復制&#xff08;保留原內容&#xff09; ctrl v 粘貼 ctrl x 剪切&#xff08;跟復制不一樣的地方在于原內容清空&#xff09; ctrl z …

【python】OpenCV—Tracking(10.2)

文章目錄 BackgroundSubtractorcreateBackgroundSubtractorMOG2createBackgroundSubtractorKNN BackgroundSubtractor Opencv 有三種背景分割器 K-Nearest&#xff1a;KNN Mixture of Gaussian&#xff08;MOG2&#xff09; Geometric Multigid&#xff08;GMG&#xff09; …

AURIX TC3xx單片機介紹-啟動過程介紹2

AURIX TC377,TC387,TC397用戶啟動程序流程 用戶啟動程序是在Boot Firmware之后運行的程序(即用戶程序里的第一級Boot Loader,類似Linux的Uboot),初始化過程是CPU0完成的。用戶可以根據不同的復位事件來選擇不同的執行路徑。 AURITX 2代芯片的主要啟動過程如下(該階段只…