MySQL 調優筆記

1.如何定位慢查詢?

定位慢查詢主要依靠 MySQL 的慢查詢日志配合工具如 pt-query-digest ,mysqldumpslow 進行分析,或者通過 performance_schema 進行實時監控,進一步可以使用 EXPLAIN 分析執行計劃。

-> 開啟慢查詢日志

-- 查看慢查詢日志是否開啟:
SHOW VARIABLES LIKE 'slow_query_log%';
-- 開啟慢查詢日志(立即生效)
SET GLOBAL slow_query_log = 'ON';
-- 設置慢查詢時間閾值為 1 秒:
SET GLOBAL long_query_time = 1;
-- 設置慢查詢日志文件路徑(可選)
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
-- 查看慢查詢文件位置:
SHOW VARIABLES LIKE 'slow_query_log_file';
-- 查看慢查詢總數:
SHOW GLOBAL STATUS LIKE 'Slow_queries';

-> 收集慢查詢日志(慢于 long_query_time 的語句)

-> 使用工具提取 Top N 慢 SQL(如 pt-query-digest)

mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
pt-query-digest /var/log/mysql/slow.log

-> 對具體 SQL 使用 EXPLAIN 或 EXPLAIN ANALYZE 分析執行計劃

EXPLAIN SELECT * FROM user WHERE name LIKE '%abc%';
EXPLAIN ANALYZE SELECT * FROM user WHERE id = 123;

-> 判斷是否索引失效 / 全表掃描 / 關聯順序不佳等

-> 優化 SQL 或加索引,重復測試

2.一個 SQL 語句執行很慢,如何分析 ?

我用 EXPLAIN 分析 SQL 時,重點關注以下幾個字段:

type 是訪問類型,性能最好的是 const(主鍵查單條)、eq_ref/ref(使用索引查找),次一點的是 range(范圍掃描),最差的是 ALL(全表掃描),index(全索引掃描);

key 表示實際使用的索引,若為 NULL 則說明沒有用到索引,通常性能較差,如果 possible_key 有值,而 key 為 null,證明有索引可能能用但是沒命中,就需要考慮是什么原因導致了索引失效;

rows 代表預估掃描的行數,數字越小越好,過大說明掃描量大,效率低;

Extra 字段里如果出現 Using filesort 或 Using temporary,說明使用了額外的排序或臨時表,通常是性能瓶頸;如果看到 Using index 則說明是覆蓋索引,性能很好,避免了回表;

綜上,通過這些字段可以判斷 SQL 是否命中索引,掃描量是否合理,以及是否存在額外開銷,從而指導優化方案。

3.什么情況下索引會失效 ?

1.違反最左前綴匹配原則: 復合索引(多列索引)只有從最左邊的列開始按順序使用,跳過最左列會失效。

2.使用了函數: 如 WHERE YEAR(create_time) = 2023,索引失效,因為函數包裹了列,MySQL 無法用索引直接匹配。

3. 使用了通配符 % 開頭的 LIKE:LIKE '%abc' 無法使用索引,因為前綴不確定,但 LIKE 'abc%' 是可以走索引的。

4. 隱式類型轉換: 查詢條件的數據類型與索引列類型不匹配,會導致索引失效。

5. OR 條件沒有覆蓋所有列的索引:如果只用部分索引,另一部分條件需要全表掃描,這樣部分索引的使用反而可能加重了整體掃描成本。

6. 使用了 NOT 或 <> 等否定條件: 例如 WHERE col <> 1,MySQL一般無法利用索引。

7. 不等式比較符號(<, >, !=)后面的列索引不能用: 在復合索引中,使用不等式后,后續的列索引無法使用。 復合索引中,遇到范圍查詢(如 b > 10)后,索引只能定位該范圍,后續列(如 c)索引失效,需回表過濾;而對同一列的多范圍條件(如 b > 10 AND b < 20)則仍能利用索引縮小掃描范圍。

4.MYSQL 超大分頁怎么處理 ?

超大分頁避免使用 LIMIT offset, size,改用基于唯一索引的范圍查詢(如 WHERE id > last_id LIMIT size)實現延遲關聯,極大提升查詢效率。或者分表分庫通過拆分數據減少單表數據量。亦或者熱點數據可考慮緩存。

5.談談你對 SQL 的優化的經驗

1. 合理設計索引

根據查詢條件設計覆蓋索引,盡量減少回表。

避免冗余和過多索引,減少寫入負擔。

注意復合索引最左前綴原則,盡量讓查詢條件匹配索引順序。

2. 優化查詢語句

避免 SELECT *,只查需要的列。

避免在索引列上使用函數或表達式,保證索引可用。

拆分復雜查詢,避免過多 JOIN 或子查詢。

OR 語句可拆成多條 UNION 查詢。

3. 合理使用分頁

避免大偏移量分頁,使用基于唯一索引的延遲關聯分頁。

熱點數據可考慮緩存。

4. 分析執行計劃

使用 EXPLAIN 分析查詢路徑,重點看 typepossible_keyskeyrowsExtra 字段。

確認索引是否被使用,避免全表掃描。

注意是否有 Using filesortUsing temporary,這可能是性能瓶頸。

5.數據量與分區

對超大表考慮分區或分表,降低單表壓力。

歸檔歷史數據,減少熱點數據量。

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

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

相關文章

嵌入式 STM32 開發問題:燒錄 STM32CubeMX 創建的 Keil 程序沒有反應

燒錄 STM32CubeMX 創建的 Keil 程序沒有反應問題原因 大概率是因為沒有勾選 Reset and Run&#xff0c;程序成功燒錄到&#xff0c;但芯片不會自動復位并執行&#xff0c;而是保持停止狀態 處理策略 在 Keil 中勾選 Reset and Run 點擊 【Options for Target】 點擊 【Debu…

Flower框架中noise_multiplier與clipped_count_stddev的關系

noise_multiplier 與 clipped_count_stddev 的數學關系 在差分隱私聯邦學習中&#xff0c;noise_multiplier 和 clipped_count_stddev 是兩個核心參數&#xff0c;它們共同決定了隱私保護強度和模型精度的權衡。理解它們的關系需要從差分隱私的數學原理入手&#xff1a; 1. 高…

Laravel 從版本 5 到 12 每個版本都引入了一些新的特性、改進和棄用的功能

Laravel 從版本 5 到 12 經歷了多次更新,每個版本都引入了一些新的特性、改進和棄用的功能。下面是這些主要版本之間的關鍵區別: Laravel 5 Lumen: 引入了微框架 Lumen。Elixir: Elixir 是一個用于編譯和合并前端資源的工具,后來被 Laravel Mix 取代。Middleware Groups: 引…

Lambda 表達式的語法與使用:更簡潔、更靈活的函數式編程!

全文目錄&#xff1a; 開篇語Lambda 表達式的語法與使用&#xff1a;更簡潔、更靈活的函數式編程一、Lambda 表達式的語法1.1 Lambda 表達式的基本語法形式 二、Lambda 表達式的使用2.1 Lambda 表達式與匿名內部類的對比代碼示例&#xff1a;使用匿名內部類和 Lambda 表達式實現…

從0到1開發一個自己的工具 MCP 并發布到 test PyPi(Python個人版)

目錄 1. 我理解的 MCP2. 寫一個自己的MCP然后發布到 PyPi 上&#xff0c;包括加法工具和獲取當前 ip 工具2.1 先碎碎念一下 uv2.2 初始化項目&#xff08;全程在 cmd 下運行命令&#xff09;2.3 添加 mcp 依賴2.4 添加 server.py&#xff0c;先把加法功能添加上2.5 運行并測試加…

RabbitMQ緩存詳解:由來、發展、核心場景與實戰應用

一、RabbitMQ的由來與發展歷程 1.1 RabbitMQ的誕生背景 RabbitMQ誕生于金融行業的需求,最初由Rabbit Technologies Ltd開發,后被SpringSource收購,最終成為Pivotal的一部分。它的設計初衷是為了解決分布式系統中消息可靠傳輸的問題。在早期金融交易系統中,系統間的通信需…

機器學習與深度學習18-線性代數01

目錄 前文回顧1.特征向量和特征值2.矩陣與模型3.內積和外積4.向量的范數5.正交矩陣 前文回顧 上一篇文章地址&#xff1a;鏈接 1.特征向量和特征值 在機器學習中&#xff0c;特征向量和特征值是用于描述數據集中的特征或變量之間關系的重要概念。它們在降維技術&#xff08;…

如何讓 VS Code 僅通過滾輪放大字體,而不縮放整個界面?

在 VS Code 中&#xff0c;默認情況下使用 Ctrl滾輪&#xff08;Windows/Linux&#xff09;或 Cmd滾輪&#xff08;Mac&#xff09;會同時縮放整個界面&#xff08;包括 UI 元素和編輯器字體&#xff09;。如果你希望僅放大編輯器字體而不影響界面縮放&#xff0c;可以通過以下…

Vue3中v-bind指令用法詳解

在 Vue 3 中&#xff0c;v-bind 是一個核心指令&#xff0c;用于動態綁定 HTML 屬性或組件的 props 到 Vue 實例的數據。以下是詳細講解&#xff1a; 一、基礎用法 1. 綁定單個屬性 vue 復制 下載 <template><!-- 綁定 img 的 src 屬性 --><img v-bind:src…

算法題(169):最大子段和(分治思想)

審題&#xff1a; 本題需要我們找到區間的最大子段和并輸出結果 思路&#xff1a; 方法一&#xff1a;分治思想 我們可以把給定區間平均分成兩部分&#xff0c;然后獲取左段區間的最大子段和&#xff0c;右段區間的最大子段和&#xff0c;以及跨區間的最大子段和。最后比較出他…

Linux 線程深度解析:從內存管理到線程控制的核心機制

文章目錄 引言一、Linux 線程概念1.1 什么是線程1.2 分頁式存儲管理1.2.1 虛擬地址和頁表的由來1.2.2 物理內存管理struct page 的主要用途 1.2.3 頁表1.2.4 頁目錄結構1.2.5 兩級頁表的地址轉換1.2.6 缺頁異常 1.3 線程的優點1.4 線程缺點1.5 線程異常1.6 線程用途 二、Linux進…

玩轉計算機視覺——按照配置部署paddleOCR(英偉達環境與昇騰300IDUO環境)

英偉達環境安裝 創建虛擬環境 conda create -n paddleOCR python3.10 -y conda activate paddleOCRconda install jupyterlab -y conda install ipykernel -y python -m ipykernel install --user --name paddleOCR --display-name "paddle OCR"下載PaddleOCR的GPU…

Java機器學習全攻略:從基礎原理到實戰案例詳解

在當今AI驅動的技術浪潮中,機器學習已成為Java開發者必須掌握的核心技能之一。本文將系統性地介紹Java機器學習的原理基礎、常用框架,并通過多個實戰案例展示如何在實際項目中應用這些技術。無論你是剛接觸機器學習的Java開發者,還是希望鞏固基礎的中級工程師,這篇文章都將…

eBPF 技術詳解及其在網絡安全領域的應用與挑戰

摘要 eBPF&#xff08;extended Berkeley Packet Filter&#xff09;是 Linux 內核中的一項革命性技術&#xff0c;它允許用戶在不修改內核代碼或加載內核模塊的情況下&#xff0c;安全、高效地運行自定義程序。eBPF 的出現極大地擴展了 Linux 內核的可編程性&#xff0c;使其…

error:MISCONF Redis is configured to save RDB snapshots

一、背景 在使用redis異步驅動方式下&#xff0c;執行hset指令時&#xff0c;報錯 redisAsyncCommand((redisAsyncContext *)c, dumpReply, "hset role:10001", "hset role:10001 name %s age %d sex %s", "mark", 31, "male");二、原…

Android-Mod-Menu 使用教程

目錄 簡介前提條件安裝步驟1. 下載和解壓項目2. 配置 Android Studio3. 安裝到設備 修改游戲 APK1. 確定游戲主活動2. 集成模組菜單方法 1&#xff1a;通過服務啟動&#xff08;推薦&#xff09;方法 2&#xff1a;通過活動啟動&#xff08;僅在游戲檢測模組時使用&#xff09;…

SpringBoot 自動化部署實戰:從環境搭建到 CI/CD 全流程

SpringBoot 自動化部署全流程實戰 一、環境準備&#xff08;開發側&#xff09; 基礎工具鏈安裝&#xff1a; # JDK 17 brew install openjdk17 # Maven 構建工具 brew install maven # Docker 環境 brew install --cask docker項目配置驗證&#xff1a; <!-- pom.xml 關…

Flutter動畫與交互:打造流暢用戶體驗的完整指南

在移動應用開發中&#xff0c;流暢的動畫和自然的交互是提升用戶體驗的關鍵因素。Flutter作為Google推出的跨平臺UI工具包&#xff0c;提供了一套強大而靈活的動畫系統&#xff0c;使開發者能夠輕松創建專業級的動畫效果。本文將深入探討Flutter中的動畫與交互技術&#xff0c;…

山東大學軟件學院項目實訓:基于大模型的模擬面試系統項目總結(九)

在山東大學軟件學院的項目實訓中&#xff0c;團隊成員們圍繞基于大模型的模擬面試系統展開了一系列開發與優化工作。以下是本周項目的核心進展與成果總結。 前端界面優化與 Bug 修復&#xff08;吳尤&#xff09; Logo 顯示問題修復 在項目開發過程中&#xff0c;團隊發現項…

14.vue.js的watch()的注意事項(1)

一、 Q &#xff1a;因為 state 有內部的屬性 也就是id。 因為要追逐id。所以要寫函數&#xff1f;而不能直接監聽state。 只監聽state &#xff0c;監聽不到id的變化嗎&#xff1f; A&#xff1a; 為什么監聽 state 不等于監聽 state.id&#xff1f; 在 Vue 3 中&#xff0…