mysql性能提升方法大匯總

前言

最近在開發自己的小程序的時候,由于業務功能對系統性能的要求很高,系統性能損耗又主要在mysql上,而業務功能的數據表很多,單表數據量也很大,又涉及到很多場景的數據查詢,所以我針對mysql調用做了優化,成功地把原本一次復雜請求的時間從3到5秒加速到0.5秒以內,順便總結了一些mysql性能優化的方法

一 mysql配置調整

1.1 內存相關

1.1.1 innodb_buffer_pool_size

mysql數據頁索引頁緩沖區的大小: mysql中命中率高的數據頁會長期駐留,讀取數據時如果在buffer pool中,就無需訪問磁盤,InnoDB的數據頁和索引頁都會緩存在這里,

對于專用數據庫服務器,可以設為物理內存的60%~80%,但是要注意,如果設置得太高,會導致操作系統內存不足而swap,系統整體性能下降,而且內存競爭影響其他服務,可以通過以下語句監控buffer pool得命中率

SHOW ENGINE INNODB STATUS

如果status中的buffer pool hit rate命中率小于99%就說明太小了

1.1.2?innodb_log_buffer_size

redo log緩沖區的大小,事務執行過程中,修改操作寫入內存中的log buffer,提交時flush到redo log 文件,redo log緩沖區用于存放事務提交前的redo日志,在事務提交時刷寫到磁盤。

一般設置為 8MB~64MB(默認 16MB),如果事務頻繁、單個事務很大,可以設置更大一點,減少磁盤寫入次數,如果innodb_log_buffer_size設置得太小,會導致大事務頻繁觸發flush,性能下降,可以監控Innodb_log_waits,值大于 0 表示內存不夠,

SHOW GLOBAL STATUS LIKE 'Innodb_log_waits';

 

1.2 連接和并發

1.2.1 max_connections

服務器連接得最大并發連接數,超過該值的新連接會被拒絕。每個連接占用一定資源(內存+線程)

此參數是系統連接保護閾值。Web應用一般設置在 200~1000,高并發系統可適當調高,搭配連接池使用,設置太小時,高峰期連接被拒,出現 “Too many connections” 錯誤,太大時每個連接占用資源,連接過多會耗盡內存,崩潰風險增加,可以查看 Max_used_connections 是否接近 max_connections的值

SHOW GLOBAL STATUS LIKE 'Max_used_connections';

1.2.2?thread_cache_size

MySQL會重用已結束的線程,減少頻繁創建線程的開銷。線程結束后保留在線程緩存池中,下一個連接復用已有線程。

數據庫服務一般設置為16~100,根據連接頻繁程度和CPU核心數決定,設置太小時會導致Threads_created 值很高,頻繁創建線程,影響性能,設置太大時占用內存資源而且提升不明顯

SHOW GLOBAL STATUS LIKE 'threads_created';

1.2.3?table_open_cache

打開的表文件的緩存數量,避免頻繁打開/關閉表文件,MySQL 每次訪問表都會打開表文件,保存在 cache 中,復用效率更高。注意它緩存的是表文件的句柄和元數據結構,而不是表的數據變身

一般小型系統設置為512~2048,大表多或高并發可設為 8192,太小時會導致Opened_tables 值高,頻繁打開表影響性能,太多則會占用過多內存,可以通過下面語句獲取系統一共打開過多少次表文件

SHOW GLOBAL STATUS LIKE 'opened_tables';

你需要間隔一段時間(例如 1 分鐘、5 分鐘)對比兩次結果,觀察 opened_tables 的增長量。如果 5分鐘內增長了幾百甚至上千個,那就是異常的。正常情況下opened_tables 每分鐘增長小于10 ,如果每分鐘增長50到100之間,說明 table_open_cache 太小或有短連接頻繁打開關閉表

也可以使用下面語句拿到獲取表時命中緩存和沒命中緩存的case數量,自行計算

SHOW GLOBAL STATUS LIKE 'Table_open_cache_hits';
SHOW GLOBAL STATUS LIKE 'Table_open_cache_misses';
?


命中率 = Table_open_cache_hits / (Table_open_cache_hits + Table_open_cache_misses),通常命中率會大于95%,如果命中率小于90%,就應該考慮增加 table_open_cache

1.3 日志和事務

1.3.1 innodb_flush_log_at_trx_commit

這個配置控制事務redo日志何時寫入磁盤

  • 1:每次提交事務都同步寫磁盤(最安全)

  • 2:寫OS緩存,根據系統自己的策略定時刷盤(折中)

  • 0:僅寫內存,崩潰時候redo日志全部丟失

高可靠性場景:設為1,對性能要求高并且允許少量數據丟失時設為2,數據丟失幾乎不造成損失時可以考慮設置為0

1.3.2 sync_binlog

控制bin log刷盤頻率,影響主從一致性。

  • 1:每次事務都刷盤,最安全

  • 0:交給操作系統定期刷盤,性能較高,但可能丟 binlog

  • N:每 N 次事務刷一次

高可靠性場景下設為1,性能優先:設為 100 或更高


?

1.4 臨時文件與排序

1.4.1?tmp_table_size和max_heap_table_size? ? ? ? ? ? ??

這兩個配置控制臨時表的最大內存使用,超出后寫磁盤,前者控制MySQL 創建內部臨時表(用于 GROUP BY、ORDER BY、DISTINCT 等操作)時,可使用的最大內存空間,后者控制用戶或系統創建的MEMORY引擎表的最大大小,當 MySQL創建一個內存臨時表時,會以 tmp_table_size 和 max_heap_table_size 中的較小值為準,作為臨時表在內存中的最大可用空間

默認16MB太小,建議提升到 64MB~256MB,太小會導致臨時表頻繁寫磁盤,性能下降

SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables';

1.4.2?sort_buffer_size

每個線程排序操作使用的緩沖區大小。ORDER BY、GROUP BY 會使用此 buffer,如果不足會寫磁盤

這個是單線程的變量,建議設置為2MB~8MB,太小時排序頻繁落盤,影響性能,不過高并發場景不要設太大,因為每個連接消耗內存大,有服務器內存撐爆風險

SHOW GLOBAL STATUS LIKE 'Sort_merge_passes';

二 索引設計和sql優化

2.1 索引設計

2.1.1 合理的索引

覆蓋索引:如果查詢使用的索引語句包含了所有查詢需要的字段,mysql就不需要回表查詢表數據,大大提升性能

前綴索引:當字段是長字符串(如 VARCHARTEXT),為了節省索引空間和提升性能,可以只索引字段的前幾位(前綴)。這樣可以減少索引大小,但仍保持較好的查詢效率。比如? ? ? ? ? ? ? ?

CREATE INDEX idx_email_prefix ON users(email(10));

表示只索引 email 字段的前 10 個字符。

組合索引:當查詢條件涉及多個列時,可以將多個列聯合建立一個索引。MySQL會將多個字段組合在一起作為一個整體進行索引,大大提升多字段查詢性能。比如下面索引

CREATE INDEX idx_user_status ON users(user_id, status);

對于同時又user_id和status的查詢就能夠快速定位到。

2.1.1 避免不合理的索引設計

索引過多:索引不僅會占用磁盤空間,還是增加寫操作的開銷,建議不超過每表 5-6 個。不超過總字段的三分之一

避免長文本索引:普通索引會存儲值的所有內容,對于很長的字段會占用很大的空間,對于前面部分的區分度就比較高的長字符可以使用前綴索引

2.2 SQL 語句優化

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

  • 保證查詢能使用到索引,對于組合索引和字符模糊匹配要注意最左匹配原則,盡可能利用覆蓋索引

  • 使用 EXPLAIN 分析執行計劃,關注 typerowsExtra 字段

  • 大表避免 OFFSET 深分頁,推薦“游標式分頁”(如 WHERE id > ?

  • 避免 IN 過多項(>1000),或考慮改用臨時表

  • 聯表限制:盡量不超過 3 張表JOIN,JOIN 字段必須加索引

  • 盡量避免使用not in,or和union(盡可能用union all代替union)

  • 避免索引列參與函數計算:WHERE DATE(create_time) = '2023-01-01' 會導致索引失效

三 應用系統

3.1 減少不必要的請求

  • 緩存策略

    • 使用 Redis/Memcached 緩存熱點數據。

    • 對于不變數據(如省市、用戶等級),做本地緩存或CDN緩存。

  • 連接池

    • 應用側應使用數據庫連接池,如 Druid、HikariCP,控制最大并發連接。

  • 接口聚合

    • 盡量減少多次小查詢,改為批量查詢或數據合并。

3.2 數據庫訪問控制

  • 限流與降級策略:高峰期臨時關閉非核心查詢。

  • 使用讀寫分離:讀請求走從庫,寫請求走主庫。

  • 使用中間層封裝數據庫訪問(如 DAO 層),方面中間層做統一的優化管理,避免業務層直接操作 SQL。

3.3 持續監控與預警

  • 使用工具如:

    • 慢查詢日志 + pt-query-digest 分析慢 SQL。

    • Prometheus + Grafana 或 Percona Toolkit 做實時性能監控。

    • MySQL Enterprise Monitor 商業監控套件。

3.4 表設計

主鍵:優選整數型、自增主鍵(如 BIGINT AUTO_INCREMENT),避免使用 UUID 作為主鍵,因為UUID隨機性太大,插入時會頻繁觸發頁分裂

字段類型:明確字段類型,選擇最合適的數據類型,字段長度固定的場景下使用定長字段而不是變長字段,使用最小足夠類型,避免使用 TEXT/BLOB 除非確實要存大文本;這類字段性能差且不易索引

NULL值:非必要字段不要設置為 NULL,使用默認值(如 0、'')可減少 NULL 判斷。

冗余字段:對于查詢多寫入少的情況可以適當添加一些冗余字段避免join操作影響性能

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

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

相關文章

多模態RAG與LlamaIndex——1.deepresearch調研

摘要 關鍵點: 多模態RAG技術通過結合文本、圖像、表格和視頻等多種數據類型,擴展了傳統RAG(檢索增強生成)的功能。LlamaIndex是一個開源框架,支持多模態RAG,提供處理文本和圖像的模型、嵌入和索引功能。研…

LabVIEW中算法開發的系統化解決方案與優化

在 LabVIEW 開發環境中,算法實現是連接硬件數據采集與上層應用的核心環節。由于圖形化編程范式與傳統文本語言存在差異,LabVIEW 中的算法開發需要特別關注執行效率、代碼可維護性以及與硬件資源的適配性。本文從算法架構設計、性能優化到工程實現&#x…

OpenCV中的光流估計方法詳解

文章目錄 一、引言二、核心算法原理1. 光流法基本概念2. 算法實現步驟 三、代碼實現詳解1. 初始化設置2. 特征點檢測3. 光流計算與軌跡繪制 四、實際應用效果五、優化方向六、結語 一、引言 在計算機視覺領域,運動目標跟蹤是一個重要的研究方向,廣泛應用…

零基礎入門MySQL:10分鐘搞定數據庫基本操作

📚 一、MySQL是什么? MySQL 是一個關系型數據庫管理系統(簡單理解:用“表格”存儲數據的倉庫)。 就像Excel表格一樣,數據按行和列整齊存放,方便快速查找和管理! 為什么要學MySQL&a…

LeetCode 3335.字符串轉換后的長度 I:I先遞推

【LetMeFly】3335.字符串轉換后的長度 I:I先遞推 力扣題目鏈接:https://leetcode.cn/problems/total-characters-in-string-after-transformations-i/ 給你一個字符串 s 和一個整數 t,表示要執行的 轉換 次數。每次 轉換 需要根據以下規則替…

Linux 系統如何掛載U盤

一、問題描述 Linux系統不像Windows系統有圖形化界面,對于機房服務器安裝的Linux尤其如此,那么有時候需要拷貝U盤或者光盤的文件到Linux系統中去,與 Windows 系統自動為 U 盤分配盤符不同,Linux 系統需要手動將 U 盤掛載到指定目…

Qt進階開發:QTcpServer的詳解

文章目錄 一、QTcpServer 簡介二、常用成員函數的使用三、信號函數的使用四、虛函數的使用五、連接多客戶端-服務端示例一、QTcpServer 簡介 QTcpServer 是 Qt 網絡模塊中的一個核心類,用于實現 基于 TCP 協議的服務端(Server),它負責監聽端口、接收客戶端連接請求,并通過…

大項目k8s集群有多大規模,多少節點,有多少pod

1. 實際參與過生產級 K8s 集群 回答示例: 目前我負責的 K8s 集群規模為 300 個物理節點,分布在 3 個可用區(AZ),采用多控制平面高可用架構。集群日常運行約 12,000 個 Pod,資源利用率保持在 65%-75%&#…

是 OpenCV 的 CUDA 模塊中用于在 GPU 上對圖像或矩陣進行轉置操作函數cv::cuda::transpose

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::cuda::transpose 是 OpenCV 的 CUDA 模塊中的一個函數,用于在 GPU 上對圖像或矩陣進行轉置操作(Transpose&#xff0…

使用 goaccess 分析 nginx 訪問日志

介紹 goaccess 是一個在本地解析日志的工具, 可以直接在命令行終端環境中使用 TUI 界面查看分析結果, 也可以導出為更加豐富的 HTML 頁面. 官網: https://goaccess.io/ 下載安裝 常見的 Linux 包管理器中都包含了 goaccess, 直接安裝就行. 以 Ubuntu 為例: sudo apt instal…

Google LLM prompt engineering(谷歌提示詞工程指南)

文章目錄 基本概念AI輸出配置:調整AI的回答方式輸出長度溫度(Temperature)Top-K和Top-P 提示技術:讓AI更好地理解你零樣本提示(Zero-shot)少樣本提示(Few-shot)系統提示(…

簡單介紹Qt的屬性子系統

深入理解Qt的屬性系統 ? 筆者最近正在大規模的開發Qt的項目和工程,這里筆者需要指出的是,這個玩意在最常規的Qt開發中是相對比較少用的,筆者也只是在Qt的QPropertyAnimation需要動畫感知筆者設置的一個屬性的時候方才知道這個東西的。因此&…

NestJS 框架深度解析

框架功能分析 NestJS 是一個基于 Node.js 的漸進式框架,專為構建高效、可擴展的服務器端應用程序而設計。其核心理念結合了 面向對象編程(OOP)、函數式編程(FP) 和 函數式響應式編程(FRP)&…

PostgreSQL技術大講堂 - 第89講:重講數據庫完全恢復

PostgreSQL技術大講堂 - 第89講,主題:重講數據庫完全恢復 時間:2025年05月10日19:30 歡迎持續關注CUUG PostgreSQL技術大講堂。

ubuntu部署supabase

安裝supabse https://supabase.com/docs/guides/local-development/cli/getting-started?queryGroupsplatform&platformlinux brew install supabase/tap/supabase supabase init supabase start需要使用brewuser進行安裝: brew安裝參考鏈接: ht…

基于javaweb的SpringBoot酒店管理系統設計與實現(源碼+文檔+部署講解)

技術范圍:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

python 上海新聞爬蟲, 東方網 + 澎湃新聞

1. 起因, 目的: 繼續做新聞爬蟲。我之前寫過。此文先記錄2個新聞來源。后面打算進行過濾,比如只選出某一個類型新聞。 2. 先看效果 過濾出某種類型的新聞,然后生成 html 頁面,而且,自動打開這個頁面。 比如科技犯罪…

使用bitNet架構

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、配置二、報錯總結 前言 大型語言模型(LLM)面臨的挑戰:高能耗、高內存需求、部署門檻高。 微軟提出 BitNet 架構&#x…

筆試強訓(十七)

文章目錄 活動安排題解代碼 哈夫曼編碼題解代碼 奇數位丟棄題解代碼 活動安排 題目鏈接 題解 1. 區間貪心 排序 2. 如果有重疊部分,每次選擇右端點較小的,可以盡可能多的選擇區間個數,如果沒有重疊部分,選擇下一個區間的右端…

數據庫數據清洗、預處理與質量監控、 數據質量的核心概念

數據庫數據清洗、預處理與質量監控、 數據質量的核心概念 準確性 (Accuracy) 準確性指數據正確反映其所描述的實體或事件真實狀況的程度。準確的數據應當與現實世界中的實際情況一致。 一致性 (Consistency) 一致性指數據在不同表、系統或時間點之間保持邏輯上一致的程度。…