<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      liuziyi

      liuziyi

      MySQL參數優化最佳實踐

      作為DBA,是否遇到過這樣的糟心場景:云服務器CPU、內存明明還很空閑,可一到業務高峰期,數據庫就開始“掉鏈子”——連接超時、查詢卡死不說,CPU還會突然飆到100%;查看日志更是滿屏報錯:“Too many connections”“The table is full”“Deadlock found when trying to get lock”。

      別著急加緩存、拆庫拆表!其實80%的MySQL性能問題,根源都不在硬件或架構,而在默認配置。要知道,MySQL默認配置是為1GB內存的小型機設計的,如今隨便一臺云服務器都是8核16G起步,默認參數相當于“大馬拉小車”,根本沒利用好硬件資源。

      一、先搞懂:為什么默認配置會拖垮數據庫?

      MySQL的默認配置(如max_connections僅151、innodb_buffer_pool_size僅幾十MB)是基于早期小型服務器設計的,和現在的云服務器硬件完全不匹配:

      • 內存利用不足:16G內存的服務器,默認配置下MySQL可能只用到幾百MB,大量內存閑置,卻頻繁讀磁盤;
      • 連接數上限太低:高峰期并發請求一多,連接數很快耗盡,直接報“Too many connections”;
      • 臨時表效率差:復雜查詢的臨時表默認僅16MB,超出就寫磁盤,IO開銷瞬間飆升。

      優化的本質很簡單:讓MySQL充分利用現代服務器的硬件資源,同時避免低效操作

      二、必調的6個MySQL參數:從配置文件下手

      MySQL的核心配置文件路徑通常是/etc/my.cnf/etc/mysql/my.cnf,修改后執行systemctl restart mysqld重啟生效。以下6個參數是優化核心,每一個都對應一個高頻問題。

      1. 增大最大連接數:解決“Too many connections”

      • 參數max_connections = 2000
      • 默認值:151(高并發下1分鐘就能耗盡)
      • 原理:每建立一個MySQL連接約消耗256KB內存,2000個連接僅占500MB,對16G服務器完全無壓力;
      • 注意:無需追求過高,根據業務并發量調整,避免內存浪費。

      2. 調整InnoDB緩沖池:大幅提升查詢速度(最重要參數)

      • 參數innodb_buffer_pool_size = 10G(16G內存服務器示例)
      • 默認值:僅幾十MB,完全沒利用內存
      • 原理:緩沖池是InnoDB的“緩存區”,會緩存表數據和索引,命中緩沖池的查詢無需讀磁盤,速度提升10倍以上;
      • 建議:設為服務器物理內存的60%~70%——32G內存設20G,64G內存設40G,既保證MySQL性能,又給系統留足內存。

      3. 優化臨時表內存:避免“磁盤臨時表”拖慢查詢

      • 參數tmp_table_size = 256M + max_heap_table_size = 256M
      • 默認值:均為16M
      • 原理:執行GROUP BY、ORDER BY等復雜查詢時,MySQL會創建臨時表;若臨時表超過16M,默認會寫入磁盤,IO開銷驟增;
      • 注意:兩個參數必須設為相同值,MySQL會取較小值生效,256M對多數業務足夠。

      4. 增大線程緩存:降低新建連接開銷

      • 參數thread_cache_size = 100
      • 默認值:9(高并發下頻繁創建/銷毀線程,CPU開銷大)
      • 原理:線程緩存會復用已關閉的連接線程,減少新建線程的資源消耗;
      • 建議:按公式“8 + max_connections / 100”計算,最大不超過100,2000連接對應100即可。

      5. 啟用慢查詢日志:定位性能瓶頸

      • 參數
        slow_query_log = 1
        slow_query_log_file = /var/log/mysql/slow.log
        long_query_time = 1
        log_queries_not_using_indexes = 1
        
      • 作用
        1. 記錄執行時間超過1秒的SQL(可根據業務調整long_query_time,如0.5秒);
        2. 自動記錄“沒用到索引”的查詢,幫你快速發現缺索引的SQL;
      • 注意:日志文件需給MySQL讀寫權限,避免報錯。

      6. 調整InnoDB日志文件:提升寫入性能

      • 參數innodb_log_file_size = 2G + innodb_log_files_in_group = 2
      • 默認值:僅48M,頻繁觸發“checkpoint”(把內存數據刷到磁盤),導致IO抖動;
      • 原理:日志文件越大,MySQL刷盤頻率越低,寫入性能越穩定;
      • 建議:設為innodb_buffer_pool_size的25%(如10G緩沖池對應2.5G日志文件),最大不超過4G;
      • 重要操作:修改前需先停MySQL,刪除舊日志文件(默認在/var/lib/mysql/ib_logfile0ib_logfile1),再重啟,否則會報錯。

      三、比調參更重要:3條SQL優化規范

      參數調好后,若SQL寫得爛,數據庫照樣會卡死。這3條規范是“避坑關鍵”,每個都有明確的錯誤/正確示例。

      1. 必為WHERE/ORDER BY字段加索引,避免全表掃描

      • 錯誤寫法:查詢用戶訂單時,未加索引,觸發全表掃描,數據量大時直接卡死:
        SELECT * FROM orders WHERE user_id = 123 ORDER BY create_time;
        
      • 正確寫法:創建“user_id+create_time”的聯合索引,查詢直接走索引,速度秒出:
        ALTER TABLE orders ADD INDEX idx_user_time (user_id, create_time);
        

      2. 避免SELECT *,只查需要的字段

      • 錯誤寫法:SELECT *會讀取所有字段,不僅浪費內存和帶寬,還可能無法利用“覆蓋索引”(需回表查數據);
      • 正確寫法:明確指定需要的字段,減少數據傳輸量,還能觸發覆蓋索引:
        SELECT id, name, email FROM users WHERE status = 1;
        

      3. 深度分頁用“游標分頁”,替代OFFSET

      • 錯誤寫法:OFFSET 100000會先掃描前100000條數據再丟棄,效率極低:
        SELECT * FROM articles ORDER BY id LIMIT 100000, 10;
        
      • 正確寫法:用“id > 100000”定位起點,直接掃描后續數據,效率提升100倍:
        SELECT * FROM articles WHERE id > 100000 ORDER BY id LIMIT 10;
        

      四、優化后怎么驗證?3步確認效果

      優化不是“調完就忘”,必須通過數據驗證效果,避免白忙活。

      1. 查看當前連接數:確認連接數足夠

      執行命令SHOW STATUS LIKE 'Threads_connected';,對比當前連接數和max_connections,確保高峰期未達上限。

      2. 檢查緩沖池命中率:越高越好

      執行命令SHOW ENGINE INNODB STATUS\G,在“BUFFER POOL AND MEMORY”部分找到“reads”和“read_requests”,按公式計算命中率:

      命中率 = (1 - (reads / read_requests)) * 100%
      

      理想命中率需>99%,若低于95%,說明緩沖池設小了,需適當調大。

      3. 分析慢查詢日志:揪出殘留的爛SQL

      執行命令mysqldumpslow -s t /var/log/mysql/slow.log,按執行時間排序慢查詢,重點優化耗時久、無索引的SQL。

      五、避坑指南:3個安全與穩定性建議

      優化時別只顧性能,還要注意安全,避免引發新問題:

      1. 別盲目調大innodb_buffer_pool_size:若設為物理內存的80%以上,可能導致系統內存不足,觸發OOM Killer(直接殺死MySQL進程);
      2. 必須監控慢查詢:優化后若不看慢查詢日志,新上線的爛SQL會再次拖垮數據庫;
      3. 主庫不直接執行DDL:在主庫執行ALTER TABLE等操作會鎖表,用pt-online-schema-change工具實現“在線改表”,不影響業務。

      六、現成配置:16GB內存服務器推薦組合

      直接復制以下配置到my.cnf,修改后重啟即可用,適用于多數16G內存的業務場景:

      [mysqld]
      max_connections = 2000
      innodb_buffer_pool_size = 10G
      tmp_table_size = 256M
      max_heap_table_size = 256M
      thread_cache_size = 100
      slow_query_log = 1
      slow_query_log_file = /var/log/mysql/slow.log
      long_query_time = 1
      innodb_log_file_size = 2G
      innodb_log_files_in_group = 2
      

      七、MySQL 優化實操 Checklist

      1、參數修改 Checklist(核心 6 項)

      優化目標 參數配置(16G 內存示例) 操作步驟 注意事項(避坑關鍵)
      解決“Too many connections” max_connections = 2000 1. 打開配置文件(/etc/my.cnf/etc/mysql/my.cnf
      2. 新增/修改該參數
      3. 重啟 MySQL(systemctl restart mysqld
      1. 每連接約占 256KB 內存,2000 連接≈500MB,無需超過 3000(避免內存浪費)
      2. 重啟前確認業務低峰期
      提升查詢速度(核心) innodb_buffer_pool_size = 10G 同上述步驟 1-3 1. 其他內存適配:32G 設 20G、64G 設 40G(物理內存的 60%-70%)
      2. 不可超過 80% 內存(防止 OOM)
      避免磁盤臨時表 tmp_table_size = 256M
      max_heap_table_size = 256M
      1. 兩個參數必須同時配置且值相同
      2. 同上述步驟 1-3
      1. 不可低于 128M(復雜查詢易觸發磁盤寫入)
      2. 無需超過 512M(避免內存過度占用)
      降低連接開銷 thread_cache_size = 100 同上述步驟 1-3 1. 計算公式:8 + max_connections/100,最大不超過 100(超過無增益)
      2. 無需手動清理緩存
      定位慢 SQL slow_query_log = 1
      slow_query_log_file = /var/log/mysql/slow.log
      long_query_time = 1
      log_queries_not_using_indexes = 1
      1. 配置參數后,執行 chown mysql:mysql /var/log/mysql/slow.log(賦權)
      2. 重啟 MySQL
      1. 日志文件路徑需提前創建目錄(mkdir -p /var/log/mysql
      2. long_query_time 可根據業務設為 0.5 秒(更嚴格)
      提升寫入性能 innodb_log_file_size = 2G
      innodb_log_files_in_group = 2
      1. 停止 MySQL(systemctl stop mysqld
      2. 刪除舊日志(rm /var/lib/mysql/ib_logfile0 ib_logfile1
      3. 配置參數并重啟
      1. 必須刪舊日志(否則啟動報錯)
      2. 最大不超過 4G(過大可能導致恢復時間變長)

      2、SQL 規范 Checklist(必查 4 項)

      規范類別 錯誤寫法(低效/風險) 正確寫法(高效) 檢查方法(驗證是否合規)
      索引覆蓋 SELECT * FROM orders WHERE user_id=123 ORDER BY create_time; ALTER TABLE orders ADD INDEX idx_user_time (user_id, create_time);(先加索引)
      再執行查詢
      EXPLAIN 查看執行計劃,確保“type”≠ALL(避免全表掃描)、“Extra”無“Using filesort”
      避免 SELECT * SELECT * FROM users WHERE status=1; SELECT id, name, email FROM users WHERE status=1; 1. 檢查代碼中所有 SQL,禁止出現 SELECT *
      2. 用 EXPLAIN 看“Extra”是否有“Using index”(覆蓋索引最優)
      深度分頁優化 SELECT * FROM articles ORDER BY id LIMIT 100000, 10; SELECT * FROM articles WHERE id>100000 ORDER BY id LIMIT 10; 1. 分頁場景中,禁止 OFFSET 超過 10000
      2. 確保分頁依賴“自增ID”或“時間戳”(游標字段需有序)
      避免無索引查詢 SELECT count(*) FROM goods WHERE category_id=456; 先加索引:ALTER TABLE goods ADD INDEX idx_category (category_id); 1. 查看慢查詢日志(/var/log/mysql/slow.log
      2. 用 SHOW INDEX FROM 表名 確認索引存在

      3、優化后效果驗證 Checklist(3 步確認)

      驗證維度 執行命令 目標值/合格標準 結果解讀與后續動作
      連接數是否充足 SHOW STATUS LIKE 'Threads_connected'; 高峰期值 < max_connections 的 80%(即 <1600) 1. 若接近 2000,需檢查是否有連接泄漏(比如代碼未關連接)
      2. 若遠低于 1000,可適當調低 max_connections(避免資源閑置)
      緩沖池命中率(核心) 1. 執行 SHOW ENGINE INNODB STATUS\G
      2. 找“BUFFER POOL AND MEMORY”模塊,記錄 readsread_requests
      命中率 = (1 - reads/read_requests)×100% > 99% 1. 若 <95%:需調大 innodb_buffer_pool_size(如 16G 內存可增至 11G)
      2. 若 95%-99%:檢查是否有大表未被緩存(如冷數據)
      慢 SQL 清理情況 mysqldumpslow -s t /var/log/mysql/slow.log(按時間排序慢查詢) 1. 無執行時間 >3 秒的 SQL
      2. 無“沒走索引”的慢查詢
      1. 對耗時 >1 秒的 SQL:用 EXPLAIN 分析,加索引或改寫
      2. 每天固定時間(如早 9 點)分析慢日志

      4、避坑警示 Checklist(3 個高危操作)

      高危操作 風險后果 正確操作方案 檢查頻率
      主庫直接執行 DDL(如 ALTER TABLE) 鎖表導致業務讀寫阻塞,高峰期會引發雪崩 1. 用工具 pt-online-schema-change 在線改表
      2. 必須在業務低峰期執行(如凌晨 2-4 點)
      每次改表前確認
      盲目調大 innodb_buffer_pool_size 系統內存不足,觸發 OOM Killer 殺死 MySQL 進程 1. 嚴格控制在物理內存的 60%-70%
      2. 改前用 free -h 查看剩余內存(需留至少 4G 給系統)
      改參數前必查
      不監控慢查詢日志 新上線爛 SQL 拖垮數據庫,卻無法定位問題 1. 每天分析 1 次慢日志
      2. 生產環境開啟 log_queries_not_using_indexes=1(強制記錄無索引查詢)
      每日固定檢查

      總結:MySQL優化就這“三板斧”

      1. 調參數:讓MySQL用足服務器的內存、連接數資源,告別“大馬拉小車”;
      2. 加索引:避免全表掃描和磁盤臨時表,讓查詢走“快車道”;
      3. 查慢SQL:用慢查詢日志定位問題,用數據驅動優化,而非憑“感覺”。

      posted on 2025-11-02 15:59  劉子毅  閱讀(7)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 国产精品亚洲二区在线播放| 亚洲国内精品一区二区| 九九热在线观看视频精品| 国产精品污双胞胎在线观看| 中文字幕在线精品人妻| 插入中文字幕在线一区二区三区 | 久热综合在线亚洲精品| 美女高潮黄又色高清视频免费| 成人精品老熟妇一区二区| 精品无码国产污污污免费| 国产高跟黑色丝袜在线| 国产高清乱码又大又圆| 亚洲岛国av一区二区| 插插射啊爱视频日a级| 精品熟女少妇免费久久| 广昌县| 樱桃视频影院在线播放| 男人猛躁进女人免费播放| 99RE8这里有精品热视频| 色哟哟www网站入口成人学校| 四虎网址| 亚洲黄色一级片在线观看| 国产欧洲欧洲久美女久久| 亚洲精品国产av一区二区| 欧美精品国产综合久久| 亚洲av激情五月性综合| 久久精品国产亚洲av忘忧草18 | 国产精品一区二区三区性色| 精品人妻av区乱码| 国产欧美一区二区三区免费视频| 狠狠色噜噜狠狠狠777米奇小说| 熟女一区二区中文字幕| 亚洲五月天综合| 久久永久视频| 无码伊人久久大杳蕉中文无码| 亚洲一区二区偷拍精品| 亚洲中文一区二区av| 亚洲精品久久麻豆蜜桃| 精品一区二区三区不卡| 桃花岛亚洲成在人线AV| 韩国无码AV片午夜福利|