Mysql常見的優化方法

數據庫優化(底層基礎優化)

數據庫層面的優化是性能“基礎", 主要包含架構設計、存儲引擎、表結構、索引策略、配置參數等方面考慮。目標是減少資源(CPU、IO和內存)消耗。

架構設計

  • 讀寫分離:將"讀操作"和"寫操作"分離到不同的數據庫節點。
    • 主庫(Master):負責寫操作(INSERT/UPDATE/DELETE),保證數據一致性。
    • 從庫(Slave):負責讀操作(SELECT),通過主從復制(基于binlog)同步主庫數據,
    • 適用場景:讀多寫少的業務(如電商商品詳情頁,新聞網站),可通過增加從庫數量分攤讀壓力。
  • 分庫分表:當單表數據量過大時(超千萬行),或單庫壓力過高時,需拆分數據。
    • 水平分表(按行拆分):將表數據按照不同行拆分到多表。(結構相同)。如按照時間拆分。
    • 垂直分表(按列拆分):將大表中不常用的字段 拆分到子表中(減少單表寬度)
    • 分庫:將多個表拆分到不同數據庫(如按照業務模塊分庫:用戶表、訂單庫)
  • 使用緩存緩解數據庫壓力
    • 對高頻訪問且不常變化的數據(如商品分類、熱門文章)通過Redis。Memcached等緩存中間件緩存,減少數據庫的查詢次數。
    • 注意:需要處理緩存一致性(如更新數據庫后同步更新緩存)和緩存穿透/擊穿/雪崩問題。
  • 存儲引擎優化:選擇合適的存儲引擎時性能優化的關鍵,需要根據業務場景匹配特性:
    • 優先選擇InnoDB(MySQL 5.5默認):
      適合需要外鍵、事務、行級鎖、崩潰恢復的場景
      • 優化點:調整innodb_Buffer_pool_size(建議設為物理內存的50%~70%),減少IO。
      • 開啟innoDB_Flush_log_at_trx_commit(默認)保證事務持久性,若允許少量數據丟失可設置為2.提升性能。
    • MYISAM:適用于 讀多寫少,無需事務(如日志、靜態數據),優勢索引緩存效率高,但不支持事務和行鎖。崩潰后回復困難。
  • 表結構設計優化:合理設計表結構 能夠減少存儲空間,提升查詢效率。核心原則:精簡、合適、平衡范式于反范式
    • 數據類型選擇:最尋最小夠用,避免大類型存儲小數據
    • 平衡范式和反范式:
      • 范式(1NF~3NF):減少冗余(如避免同一字段再多表中重復)。但會導致多表聯查增多。
      • 反范式:適量增加冗余,減少JOIN操作,提高性能。
    • 避免過度設計:
      • 不過多適用外鍵(外鍵會增加寫操作開銷)
      • 合理設置表中字段(建議不超過20個),過多會導致IO和內存消耗。
  • 核心索引設計原則:
    • 為WHERE、JOIN、GROUP BY的字段建立索引。
    • 遵循聯合索引"最左匹配原則”
    • 優先分區分度大的字段建立索引。
  • 避免索引失效
    • 索引字段適用函數/運算。
    • OR連接無索引字段。
    • 字符串不加引號,導致類型轉換
    • 范圍查詢左邊以%開始
    • NOT IN,!=,<>
  • 索引維護
    • 定期刪除冗余索引(如主鍵已索引,舊無需再建立二級索引)。
  • 相關配置設置,通過調整MYSQL配置文件(my.config/my.ini)提升性能,
    • 內存相關:
    • innodb_buffer_pool_size:Innodb緩沖池大小(一般為物理內存的50%~70%).
    • key_buffer_size:MyISAM 索引緩存大小(僅用于 MyISAM 表)。
  • IO相關
    • innodb_flush_log_at_trx_commit:控制 redo log 刷新策略(1 = 每次提交刷盤,最安全;2 = 每秒刷盤,性能更好)。
    • sync_binlog:控制 binlog 刷新策略(1 = 每次提交刷盤,主從同步更可靠;0 = 由 OS 決定,性能高但有丟失風險)。
  • 連接相關:
    • max_connections:最大連接數(默認 151,需根據并發量調整,避免連接數不足)。
    • wait_timeout:空閑連接超時時間(釋放長期閑置的連接,默認 8 小時)。

語句優化

針對單條語句的執行效率,盡可能讓SQL走索引。核心通過EXPLAIN分析執行計劃,優化語法

  • 避免全表掃描(type:ALL),全表掃描(遍歷表中所有行),

    • 明確查詢條件:WHERE子句必須包含索引字段(或能觸發索引的條件)。
    • 反例:SELECT * FROM user(無WHERE,必全表掃描,除非表極小)。
  • 優化查詢字段:

    • 避免SELECT*:只需要查詢需要的字段,減少數據傳輸和IO,且盡可能避免回表。
    • 減少SELECT DISTINCT:DISTINCT會觸發排序去重,開銷大,可通過索引或業務邏輯避免重復數據。
  • 優化JOIN操作:JOIN是多表聯合查詢的核心,低效的JOIN會降低效率。

    • 小表驅動大表:JOIN時,用小數據量作為驅動*(左表)*,減少外層循環
    • 關聯字段加索引,JOIN的關聯字段(如s.id = b.sid中id和sid)必須建索引,否則會導致全表掃描+嵌套循環。
    • 減少Join表的數量:盡量控制表數量在3張以內。
  • 優化子查詢:子查詢(SELECT 中嵌套SELECT)可能產生臨時表,效率較低,建議使用JOIN替代。

  • 優化排序和分組

    • 利用索引排序:若排序字段是索引的一部分,可避免額外排序(索引本身有序)。
      例:索引(age, name),查詢SELECT * FROM user WHERE age > 18 ORDER BY age, name(直接用索引順序,無需排序)。
    • 限制排序數據量:排序前通過WHERE過濾掉無關數據,減少排序行數。
      例:SELECT * FROM user WHERE age > 18 ORDER BY age LIMIT 10(僅排序符合條件的行,且只取前 10)。
    • GROUP BY優化:GROUP BY會先排序再分組,可通過ORDER BY NULL禁用排序(若無需分組后排序):
      SELECT age, COUNT(*) FROM user GROUP BY age ORDER BY NULL 。
  • 分頁查詢優化:大分頁(如limit 100000,10)會掃描大量無用數據,

    • 基于主鍵分頁:利用主鍵有序性,通過WHERE定位起始位置:
      優化前:SELECT * FROM order LIMIT 100000, 10(掃描 100010 行)
      優化后:SELECT * FROM order WHERE id > 100000 LIMIT 10(僅掃描 10 行,需id是主鍵)
    • 延遲關聯:先查主鍵,再關聯獲取其他字段(減少掃描字段):
      SELECT o.* FROM order o JOIN (SELECT id FROM order LIMIT 100000, 10) t ON o.id = t.id
  • 避免頻繁創建臨時表
    以下操作可能觸發臨時表(內存或磁盤臨時表,開銷大):

    • GROUP BY、DISTINCT、UNION
    • 子查詢結果作為臨時表
      優化:盡量用JOIN替代子查詢,避免不必要的GROUP BY,或通過tmp_table_size和max_heap_table_size限制內存臨時表大小(超過則轉磁盤)。
  • 用EXPLAIN分析執行計劃
    EXPLAIN是 SQL 優化的 “利器”,通過它可查看 SQL 的執行方式(是否走索引、掃描行數等),重點關注:

    • type:訪問類型(從差到好:ALL(全表掃描)→ index(索引掃描)→ range(范圍掃描)→ ref(非唯一索引匹配)→ const(主鍵匹配))。
    • key:實際使用的索引(NULL表示未走索引)。
    • rows:預估掃描的行數(越小越好)。
    • Extra:額外信息(如Using filesort(需排序)、Using temporary(用臨時表)、Using index(覆蓋索引,無需回表))。

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

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

相關文章

利用Claude Code打造多語言網站內容翻譯工具:出海應用開發全流程實戰教程

一、工具選型與準備Claude Code 簡介 Claude Code 是 Anthropic 公司推出的 AI 編程助手&#xff0c;可以輔助開發者生成代碼、優化代碼結構、進行代碼解釋等&#xff0c;支持多種主流編程語言。開發環境準備 Claude Code 賬號或 API 接入權限Node.js 或 Python 環境&#xff0…

集成運算放大器(反向比例,同相比例)

基礎知識&#xff1a;反相比例運算原理&#xff1a;示波器顯示&#xff1a;結論&#xff1a;放大倍數為-R2/R1。R3的大小約等于R1與R2的并聯電阻。由于放大器的最大輸出電壓取決于供電電壓&#xff0c;所以如果R2為7k時&#xff0c;會導致失真。同向比例原理&#xff1a;示波器…

【HBase】HBaseJMX 接口監控信息實現釘釘告警

目錄 一、JMX 簡介 二、JMX監控信息釘釘告警實現 一、JMX 簡介 官網&#xff1a;Apache HBase ? Reference Guide JMX &#xff08;Java管理擴展&#xff09;提供了內置的工具&#xff0c;使您能夠監視和管理Java VM。要啟用遠程系統的監視和管理&#xff0c;需要在啟動Java…

SQL 語言規范與基礎操作指南

SQL 語言規范與基礎操作指南 SQL 作為數據庫操作的核心語言&#xff0c;遵循規范的語法和書寫習慣不僅能提高代碼可讀性&#xff0c;還能減少錯誤。本文整理了 SQL 的基礎規則、書寫規范及常用操作&#xff0c;適合初學者快速上手。 一、SQL 基本規則 1. 書寫格式 SQL 語句可寫…

產業園IBMS智能化集成系統功能有哪些?

產業園 IBMS&#xff08;建筑集成管理系統&#xff09;智能化集成系統是針對產業園 “多業態、多系統、多租戶” 特點設計的全局管理平臺&#xff0c;通過整合樓宇自控、安防、消防、能源、停車、租戶服務等子系統&#xff0c;實現 “集中監控、協同聯動、數據驅動、靈活服務”…

線性代數之兩個宇宙文明關于距離的對話

矢量的客觀性和主觀性宇宙中飄過來一個自由矢量&#xff0c;全世界的人都可以看到&#xff0c;大家都在想&#xff0c;怎么描述它呢&#xff0c;總不能指著它說“那個矢量”吧。數學家很聰明&#xff0c;于是建立了一個坐標系&#xff0c;這個矢量投影到坐標系下&#xff0c;就…

Camx-Tuning參數加載流程分析

調用時序圖 一、效果參數在開機時加載 CreateTuningDataManager邏輯分析 1.從xxx_module.xml獲取sensor名稱和效果參數名稱&#xff0c; 比如效果參數名稱為&#xff1a;xtc_tsp_sc520cs那么效果庫的完整名稱就是&#xff1a;com.qti.tuned.xtc_tsp_sc520cs.bin 2.優先從/data/…

《P4180 [BJWC2010] 嚴格次小生成樹》

題目描述小 C 最近學了很多最小生成樹的算法&#xff0c;Prim 算法、Kruskal 算法、消圈算法等等。正當小 C 洋洋得意之時&#xff0c;小 P 又來潑小 C 冷水了。小 P 說&#xff0c;讓小 C 求出一個無向圖的次小生成樹&#xff0c;而且這個次小生成樹還得是嚴格次小的&#xff…

Transformer淺說

rag系列文章目錄 文章目錄rag系列文章目錄前言一、簡介二、注意力機制三、架構優勢四、模型加速總結前言 近兩年大模型爆火&#xff0c;大模型的背后是transformer架構&#xff0c;transformer成為家喻戶曉的詞&#xff0c;人人都知道它&#xff0c;但是想要詳細講清楚&#x…

后臺管理系統-3-vue3之左側菜單欄和頭部導航欄的靜態搭建

文章目錄1 CommonAside組件(靜態搭建)1.1 Menu菜單1.2 準備菜單數據1.3 循環渲染菜單1.3.1 el-menu結構1.3.2 動態渲染圖標1.4 樣式設計1.5 整體代碼(CommonAside.vue)2 CommonHeader組件(靜態搭建)2.1 準備圖片URL數據2.2 頁面布局2.3 樣式設計2.4 整體代碼(CommonHeader.vue)…

VS Code配置MinGW64編譯非線性優化庫NLopt

VS Code用MinGW64編譯C代碼安裝MSYS2軟件并配置非線性優化庫NLopt和測試引用庫代碼的完整具體步驟。 1. 安裝MSYS2 下載安裝程序&#xff1a; 訪問 MSYS2官網下載 msys2-x86_64-xxxx.exe 并運行 完成安裝&#xff1a; 默認安裝路徑&#xff1a;C:\msys64安裝完成后&#xff0c…

C#通過TCP_IP與PLC通信

C#通過TCP/IP與PLC通信 本文將全面介紹如何使用C#通過TCP/IP協議與各種PLC進行通信&#xff0c;包括西門子、羅克韋爾、三菱等主流品牌PLC的連接方法。 一、PLC通信基礎 PLC通信協議概覽協議類型適用品牌特點Modbus TCP通用協議簡單易用&#xff0c;廣泛支持Siemens S7西門子PL…

Java 學習筆記(基礎篇3)

1. 數組&#xff1a;① 靜態初始化&#xff1a;(1) 格式&#xff1a;int[] arr {1, 2, 3};② 遍歷/* 格式&#xff1a; 數組名.length */ for(int i 0; i < arr.length; i){//在循環的過程中&#xff0c;i依次表示數組中的每一個索引sout(arr[i]);//就可以把數組里面的每一…

知識點匯總linuxC高級-3 shell腳本編程

shell腳本編程shell ---> 解析器&#xff1a;sh csh ksh bashshell命令 ---> shell解析的命令shell腳本 --> shell命令的有序集合shell腳本編程&#xff1a;將shell命令結合按照一定邏輯集合到一起&#xff0c;寫到一個 .sh 文件&#xff0c;去實現一個或多個功能&…

【C++學習篇】:基礎

文章目錄前言1. main() 函數2. 變量賦值3. cin和cout的一些細節4. 基本類型運算5. 內存占用6. 引用7. 常量前言 C 語法的學習整理&#xff0c;作為個人總結使用。 1. main() 函數 #include <iostream> //使用輸入輸出流庫&#xff08;cin&#xff0c;cout&#xff09;…

使用nginx反向代理kkfile

這篇說一下我解決的思路和方式哈&#xff0c;不一定適用于大家&#xff0c;可以做個參考比如我們的系統服務是http://10.63.25.35:80&#xff0c;而我們的文件服務是在10.63.25.37:8012上&#xff0c;正常不使用代理的話&#xff0c;我們前端調用后端接口&#xff0c;后端調用k…

【低成本擴容】動態擴容實戰指南

面對擴容操作時&#xff0c;下面這種操作是否也會迷惑你&#xff1f;下面來為大家解惑~size_t newcapacity 2*_capacity > (_size len)?2*_capacity:(_sizelen); //len為即將插入的字符串有效字符個數//_size為當前字符串有效字符個數//_capacity為當前容量大小//newcapa…

Product Hunt 每日熱榜 | 2025-08-14

1. Autumn 標語&#xff1a;為AI初創公司簡化的Stripe服務 介紹&#xff1a;Autumn幫助AI初創公司通過只需三個API調用來定價、計量和控制使用情況。基于Stripe搭建&#xff0c;它可以在一個地方管理訂閱、使用情況和訪問權限。無需復雜的webhooks或后端邏輯&#xff0c;非常…

Scrapy + Django爬蟲可視化項目實戰(二) 詳細版

系列文章 Scrapy + Django爬蟲可視化項目實戰(一)_django scrapy-CSDN博客 實現技術 Scrapy Django Echarts 引言 可視化部分需要讀者具備一定的Django基礎!!! 上一個文章我們已經實現了爬取景點的數據,那么接下來就是根據爬取到的數據進行可視化 一、環境搭建 (一) 創…

選擇式與生成式超啟發算法總結

這里寫目錄標題Selection HHGeneration HHGPHH示例存在大量針對特定問題設計的啟發式算法&#xff0c;近年來學術界提出了一個關鍵問題&#xff1a;如何選擇最合適的啟發式方法。這一問題推動了超啟發式&#xff08;hyper-heuristic&#xff09;方法的研究發展。超啟發式是一種…