最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 調(diào)優(yōu)的實(shí)戰(zhàn)思路

 更新時(shí)間:2025年12月13日 09:45:30   作者:CodeAmaz  
文章總結(jié)了MySQL調(diào)優(yōu)的過(guò)程,包括從確認(rèn)問(wèn)題到解決的步驟,首先,需要度量問(wèn)題,然后從SQL、索引、配置和系統(tǒng)等方面進(jìn)行排查和優(yōu)化,文章強(qiáng)調(diào)了SQL和索引的重要性,并提供了具體的優(yōu)化方法,最后,文章提供了一個(gè)實(shí)戰(zhàn)調(diào)優(yōu)流程,以及一些監(jiān)控和排查工具清單,感興趣的朋友一起看看吧

我是怎么做 MySQL 調(diào)優(yōu)的(實(shí)戰(zhàn)思路)

這不是“某幾個(gè)參數(shù)調(diào)一調(diào)”的問(wèn)題,而是一整套從 架構(gòu) → SQL → 索引 → 配置 → 系統(tǒng) 的排查流程。
你可以把這篇當(dāng)成自己的 MySQL 調(diào)優(yōu) Checklist。

一、調(diào)優(yōu)前的共識(shí):先度量,再優(yōu)化

調(diào)優(yōu)最怕兩件事:

  1. 拍腦袋調(diào)參數(shù):改了一堆配置,QPS 沒(méi)上去,反而更慢;
  2. 只盯一個(gè)點(diǎn):只會(huì)改 innodb_buffer_pool_size,其他全靠緣分。

所以第一步永遠(yuǎn)是:

  • 確認(rèn)問(wèn)題是什么
    • 慢?慢在哪?是“偶爾很慢”還是“永遠(yuǎn)都不快”?
    • CPU 打滿?IO 打滿?連接數(shù)飆高?鎖等待多?
  • 收集基礎(chǔ)信息
    • 版本:SELECT VERSION();
    • 業(yè)務(wù)類型:讀多寫(xiě)少?寫(xiě)多讀少?混合?
    • 數(shù)據(jù)量、QPS、TPS。
  • 看監(jiān)控 / 日志
    • 慢查詢?nèi)罩荆╯low log);
    • CPU / IO / QPS 曲線;
    • SHOW GLOBAL STATUS 中的一些關(guān)鍵指標(biāo)。

原則:先找到“最痛的那塊”,再下手。

二、第一刀:從 SQL 入手(慢查詢 & 執(zhí)行計(jì)劃)

絕大多數(shù) MySQL 性能問(wèn)題,都可以歸結(jié)為:SQL 寫(xiě)得不行 + 索引沒(méi)設(shè)計(jì)好

2.1 開(kāi)啟慢查詢?nèi)罩?/h4>
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;   -- 超過(guò) 1 秒的算慢查詢
SET GLOBAL log_queries_not_using_indexes = 1;  -- 也可以先開(kāi)一陣

然后看:

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

線下或運(yùn)維平臺(tái)中,可以用工具分析 slow log:

  • 比如 mysqldumpslow、pt-query-digest 等;
  • 找出 次數(shù)最多 / 最慢 / 總耗時(shí)最高 的那些 SQL。

2.2 對(duì)慢 SQL 用 EXPLAIN 做執(zhí)行計(jì)劃分析

EXPLAIN SELECT ...;

重點(diǎn)看:

  • type:訪問(wèn)類型(ALLindex、rangeref、const 等);
    • ALL = 全表掃描,基本就是優(yōu)化對(duì)象;
  • key:實(shí)際使用的索引;
  • rows:預(yù)估掃描行數(shù);
  • ExtraUsing filesort、Using temporaryUsing index 等。

2.3 改寫(xiě) SQL + 補(bǔ)索引

  • 常見(jiàn)優(yōu)化方式:
    • 高頻 WHERE 條件 / JOIN 字段 / ORDER BY 字段 建索引;
    • 把“函數(shù)/計(jì)算寫(xiě)在左邊”的寫(xiě)法改掉:
-- ? 錯(cuò)誤示例:索引容易失效
WHERE DATE(create_time) = '2025-01-01';
-- ? 正確示例:使用范圍
WHERE create_time >= '2025-01-01 00:00:00'
  AND create_time <  '2025-01-02 00:00:00';

優(yōu)先使用 聯(lián)合索引 + 最左前綴

-- 經(jīng)常這么查
WHERE user_id = ? AND status = ? AND create_time > ?;
-- 就建一個(gè)
CREATE INDEX idx_user_status_time ON t_order(user_id, status, create_time);
  • 避免在高并發(fā)場(chǎng)景下使用:
    • SELECT *(只取必要字段);
  • 大范圍 IN
    • OR 拼字段(可考慮拆成 UNION);
    • 復(fù)雜嵌套子查詢(可改 JOIN 或分步查詢)。

實(shí)戰(zhàn)經(jīng)驗(yàn):先搞定 Top N 慢 SQL,系統(tǒng)性能往往就上一個(gè)臺(tái)階。

三、第二刀:索引與表結(jié)構(gòu)設(shè)計(jì)

3.1 索引設(shè)計(jì)思路

  1. 區(qū)分“高頻查詢條件”和“偶爾查查”;
  2. 給經(jīng)常出現(xiàn)在 WHERE / JOIN / ORDER BY / GROUP BY 的列設(shè)計(jì)索引;
  3. 盡量用 聯(lián)合索引代替多個(gè)單列索引;
  4. 注意索引列的選擇性(區(qū)分度):
    • 性別、是否刪除(0/1)這類字段不要單獨(dú)建索引
    • 可以放在聯(lián)合索引里。

3.2 合理選擇主鍵與存儲(chǔ)引擎

InnoDB:

  • 強(qiáng)烈建議:自增整型主鍵 + InnoDB
  • 避免使用 UUID/業(yè)務(wù)字符串作為聚簇索引主鍵;
  • 避免過(guò)寬的主鍵,所有二級(jí)索引都要跟著變胖。

表結(jié)構(gòu)方面:

  • 避免大字段(TEXT/BLOB)頻繁參與查詢,可拆分表;
  • 合理拆分“冷熱字段”,避免每次查詢都掃一大坨無(wú)關(guān)數(shù)據(jù)。

四、第三刀:InnoDB 關(guān)鍵參數(shù)調(diào)優(yōu)

在 SQL & 索引搞定后,如果數(shù)據(jù)庫(kù)仍吃緊,可以看配置。

4.1 innodb_buffer_pool_size(最關(guān)鍵的內(nèi)存參數(shù))

  • 作用:InnoDB 用來(lái)緩存數(shù)據(jù)頁(yè) + 索引頁(yè);
  • 一般建議:物理內(nèi)存的 50%~70% 左右(線下壓測(cè)決定);
  • 過(guò)?。捍罅孔x盤,性能抖;
  • 過(guò)大:擠壓 OS 緩存/其他進(jìn)程,可能換頁(yè)。
innodb_buffer_pool_size = 8G   # 視機(jī)器內(nèi)存而定

4.2 innodb_log_file_size / log_buffer_size

  • redo log 的大小和值:
    • 太?。侯l繁 flush,增加 IO;
    • 太大:崩潰恢復(fù)時(shí)間變長(zhǎng)。
  • 典型值可從幾百 MB 到幾 GB,需結(jié)合寫(xiě)入量、硬件調(diào)整。
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M

4.3 innodb_flush_log_at_trx_commit

控制事務(wù)提交時(shí) redo log 的刷盤策略:

  • 1:每次事務(wù)提交都刷盤(最安全,最耗 IO);
  • 2:每次提交寫(xiě) OS 緩存,每秒刷盤一次;
  • 0:每秒寫(xiě)一次 + 刷盤。

業(yè)務(wù)取舍:

  • 金融/強(qiáng)一致:傾向 1
  • 對(duì)少量數(shù)據(jù)丟失能接受,可以考慮 2,性能更好。

4.4 連接數(shù)相關(guān)

max_connections
thread_cache_size
wait_timeout
interactive_timeout
  • max_connections 不是越大越好:
    • 太大容易讓機(jī)器被打爆;
    • 一般配合連接池使用,幾百~一兩千視情況。

五、第四刀:操作系統(tǒng) & 硬件層面

當(dāng)你確認(rèn):

  • SQL 已經(jīng)相對(duì)合理;
  • 索引也設(shè)計(jì)得不錯(cuò);
  • 配置也調(diào)過(guò);

此時(shí)數(shù)據(jù)庫(kù)仍然吃緊,就要看系統(tǒng)層面。

5.1 磁盤 IO

  • iostatvmstat、iotop 看:
    • 磁盤隊(duì)列長(zhǎng)度、IO 等待;
  • 如果 IO 明顯成為瓶頸:
    • 換 SSD;
    • RAID 級(jí)別調(diào)整;
    • 分庫(kù)分表、冷熱分離。

5.2 CPU

  • 大量復(fù)雜 SQL、函數(shù)計(jì)算、排序、JOIN 會(huì)吃 CPU;
  • 通過(guò)慢查詢 + EXPLAIN 優(yōu)化 SQL,減少 CPU 壓力;
  • 必要時(shí)升級(jí)機(jī)器配置或做讀寫(xiě)分離、分庫(kù)。

5.3 網(wǎng)絡(luò)

  • 主從復(fù)制延遲大、跨機(jī)房訪問(wèn)慢;
  • 盡量讓數(shù)據(jù)庫(kù)靠近應(yīng)用部署(同一可用區(qū)/機(jī)房)。

六、第五刀:架構(gòu)級(jí)優(yōu)化(分庫(kù)分表 & 讀寫(xiě)分離)

當(dāng)單實(shí)例再怎么調(diào)也扛不住時(shí),就是架構(gòu)層面問(wèn)題了。

6.1 讀寫(xiě)分離

典型做法:

  • 主庫(kù)負(fù)責(zé)寫(xiě)、從庫(kù)負(fù)責(zé)讀;
  • 中間加一個(gè)數(shù)據(jù)訪問(wèn)層(或中間件)做路由;
  • 部分請(qǐng)求強(qiáng)制走主庫(kù)(寫(xiě)后立刻讀)。

適合場(chǎng)景:

  • 讀遠(yuǎn)多于寫(xiě);
  • 允許短暫讀到舊數(shù)據(jù)的場(chǎng)景。

6.2 分庫(kù)分表

如果單表行數(shù)上億,索引高度、統(tǒng)計(jì)信息、緩存命中都會(huì)出問(wèn)題。

常見(jiàn)拆分維度:

  • 按業(yè)務(wù)維度拆庫(kù)(用戶庫(kù)、訂單庫(kù)、日志庫(kù));
  • 按 hash/范圍拆分大表:
    • 用戶 ID 取模;
    • 按時(shí)間分表(按月/按日)。

拆分后要注意:

  • 跨分片 JOIN 不再簡(jiǎn)單支持,需要應(yīng)用層處理;
  • 全局唯一主鍵(雪花算法、號(hào)段發(fā)號(hào)等);
  • 分布式事務(wù)(能避則避,多用最終一致方案)。

七、監(jiān)控與排查工具清單

調(diào)優(yōu)離不開(kāi)“觀察工具”:

  1. 慢查詢?nèi)罩?/strong>:慢 SQL 排查入口;
  2. EXPLAIN / EXPLAIN ANALYZE:看執(zhí)行計(jì)劃、實(shí)際耗時(shí);
  3. SHOW PROCESSLIST:看當(dāng)前連接、是否有鎖等待;
  4. SHOW ENGINE INNODB STATUS\G:看死鎖、事務(wù)等待;
  5. information_schema / performance_schema / sys 庫(kù):
    • 統(tǒng)計(jì)哪些 SQL 最耗費(fèi)資源。
  6. 操作系統(tǒng)工具:top、iostat、vmstat、sar 等。

八、一套實(shí)戰(zhàn)調(diào)優(yōu)流程(總結(jié)版)

給你一套可直接復(fù)用的步驟:

  • 確認(rèn)問(wèn)題類型
    • 慢:是個(gè)別 SQL 慢,還是所有操作都慢?
    • 卡:CPU 高?IO 高?鎖等待多?
  • 開(kāi)慢日志 + 抓 Top SQL
    • 找出最慢/最頻繁/總時(shí)長(zhǎng)最高的 SQL;
    • 優(yōu)先優(yōu)化前 10% 的“重災(zāi)區(qū)”。
  • 抓執(zhí)行計(jì)劃(EXPLAIN)
    • 看是否使用索引;
    • type 是否為 range/ref/const 而不是 ALL;
    • 是否大量 Using filesort、Using temporary。
  • 設(shè)計(jì)/調(diào)整索引 & 改寫(xiě) SQL
    • 減少全表掃描、回表、排序臨時(shí)表;
    • 利用覆蓋索引和聯(lián)合索引。
  • 調(diào)整 InnoDB 核心參數(shù)
    • innodb_buffer_pool_size、innodb_log_file_sizeinnodb_flush_log_at_trx_commit 等;
    • 壓測(cè)不同參數(shù)組合的效果。
  • 觀察硬件資源
    • 磁盤 IO 是否打滿;
    • CPU 是否經(jīng)常 100%;
    • 內(nèi)存是否頻繁換頁(yè)。
  • 必要時(shí)考慮架構(gòu)改造
    • 加從庫(kù)做讀寫(xiě)分離;
    • 對(duì)熱點(diǎn)庫(kù)/表做拆分。

九、小結(jié)

MySQL 調(diào)優(yōu)本質(zhì)上是一個(gè)“找瓶頸 → 定位層級(jí) → 有針對(duì)性優(yōu)化”的過(guò)程:

  1. SQL 與索引永遠(yuǎn)是第一優(yōu)先級(jí);
  2. InnoDB 參數(shù)是在“SQL/索引合理之后”的加分項(xiàng);
  3. 再往上,是硬件和架構(gòu)層面的擴(kuò)展。

一句話:

不要指望靠改幾個(gè)參數(shù)就“神奇提速”,調(diào)優(yōu)一定是數(shù)據(jù)驅(qū)動(dòng) + 全鏈路思考。
養(yǎng)成“看慢日志 + EXPLAIN + 監(jiān)控”的習(xí)慣,你的 MySQL 水平會(huì)非??斓厣蟻?lái)。

到此這篇關(guān)于MySQL 調(diào)優(yōu)的實(shí)戰(zhàn)思路的文章就介紹到這了,更多相關(guān)mysql調(diào)優(yōu)思路內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL進(jìn)階SELECT語(yǔ)法篇

    MySQL進(jìn)階SELECT語(yǔ)法篇

    從這個(gè)基本語(yǔ)法可以看出,最簡(jiǎn)單的SELECT語(yǔ)句是SELECT select_list,實(shí)際上利用這個(gè)最簡(jiǎn)單的SELECT語(yǔ)句,你也可以完成許多你期待的功能,首先你能利用它進(jìn)行MySQL所支持的任何運(yùn)算,例如:SELECT 1+1,它將返回2;其次,你也能利用它給變量賦值,而在PHP中,運(yùn)用SELECT語(yǔ)句的這種功能,你就可以自由地運(yùn)用MySQL的函數(shù)為PHP程序進(jìn)行各種運(yùn)算,并賦值給變量。在很多的時(shí)候,你會(huì)發(fā)現(xiàn)MySQL擁有許多比PHP更為功能強(qiáng)大的函數(shù)。
    2008-04-04
  • MySQL觸發(fā)器Trigger加載及目前局限性

    MySQL觸發(fā)器Trigger加載及目前局限性

    這篇文章主要為大家介紹了MySQL觸發(fā)器Trigger加載以及目前局限性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • MySQL數(shù)據(jù)表分區(qū)技術(shù)PARTITION詳解

    MySQL數(shù)據(jù)表分區(qū)技術(shù)PARTITION詳解

    在處理大規(guī)模數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)性能的優(yōu)化變得尤為重要,MySQL提供了一種稱為“分區(qū)”(Partitioning)的技術(shù),可以顯著提高查詢效率和管理大型數(shù)據(jù)庫(kù)表的能力,本文將詳細(xì)介紹MySQL中的數(shù)據(jù)表分區(qū)技術(shù),包括其基本概念、類型以及如何實(shí)現(xiàn)和維護(hù),需要的朋友可以參考下
    2025-02-02
  • MySQL8中的存儲(chǔ)引擎以及文件解析

    MySQL8中的存儲(chǔ)引擎以及文件解析

    這篇文章主要介紹了MySQL8中的存儲(chǔ)引擎以及文件使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • MySQL中DATE_FORMAT()函數(shù)將Date轉(zhuǎn)為字符串

    MySQL中DATE_FORMAT()函數(shù)將Date轉(zhuǎn)為字符串

    時(shí)間、字符串、時(shí)間戳之間的互相轉(zhuǎn)換很常用,下面這篇文章主要給大家介紹了關(guān)于MySQL中DATE_FORMAT()函數(shù)將Date轉(zhuǎn)為字符串的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 淺談mysql使用limit分頁(yè)優(yōu)化方案的實(shí)現(xiàn)

    淺談mysql使用limit分頁(yè)優(yōu)化方案的實(shí)現(xiàn)

    在mysql中l(wèi)imit可以實(shí)現(xiàn)快速分頁(yè),但是如果數(shù)據(jù)到了幾百萬(wàn)時(shí)我們的limit必須優(yōu)化才能有效的合理的實(shí)現(xiàn)分頁(yè)了,否則可能卡死你的服務(wù)器哦。感興趣的可以一起來(lái)了解一下如何實(shí)現(xiàn)優(yōu)化
    2018-12-12
  • 一文搞懂Mysql的行級(jí)鎖到底是怎么加的

    一文搞懂Mysql的行級(jí)鎖到底是怎么加的

    在MySQL中行級(jí)鎖是一種非常重要的鎖機(jī)制,用于在高并發(fā)環(huán)境下提高數(shù)據(jù)庫(kù)的性能和數(shù)據(jù)一致性,這篇文章主要介紹了Mysql的行級(jí)鎖到底是怎么加的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-04-04
  • SQL算術(shù)運(yùn)算符之加法、減法、乘法、除法和取模的用法例子

    SQL算術(shù)運(yùn)算符之加法、減法、乘法、除法和取模的用法例子

    算術(shù)運(yùn)算符主要用于數(shù)學(xué)運(yùn)算,其可以連接運(yùn)算符前后的兩個(gè)數(shù)值或表達(dá)式,對(duì)數(shù)值或表達(dá)式進(jìn)行加(+)、減(-)、乘(*)、除(/)和取模(%)運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于SQL算術(shù)運(yùn)算符之加法、減法、乘法、除法和取模用法的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • MySQL解決數(shù)據(jù)導(dǎo)入導(dǎo)出含有外鍵的方案

    MySQL解決數(shù)據(jù)導(dǎo)入導(dǎo)出含有外鍵的方案

    這篇文章主要介紹了MySQL解決數(shù)據(jù)導(dǎo)入導(dǎo)出含有外鍵的情況,文中通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家解決問(wèn)題有一定的幫助,需要的朋友可以參考下
    2024-11-11
  • MySQL之Innodb_buffer_pool_size設(shè)置方式

    MySQL之Innodb_buffer_pool_size設(shè)置方式

    這篇文章主要介紹了MySQL之Innodb_buffer_pool_size設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評(píng)論

海城市| 宜昌市| 阳高县| 榆中县| 新民市| 客服| 太仆寺旗| 博白县| 聂拉木县| 瑞安市| 伊金霍洛旗| 金华市| 通河县| 台南市| 大田县| 江川县| 汝阳县| 都兰县| 贵港市| 即墨市| 长白| 金溪县| 昌图县| 彰化县| 石景山区| 大悟县| 浪卡子县| 白山市| 原阳县| 措勤县| 平陆县| 双辽市| 隆尧县| 凌海市| 东乡族自治县| 嘉祥县| 明水县| 泰宁县| 冀州市| 周至县| 泾源县|