mysql 性能參數調優詳解

1 優化連接池

連接池運行機制
MySQL連接器中的連接池,用以提高數據庫密集型應用程序的性能和可擴展性,默認啟用。MySQL連接器負責管理連接池中的多個連接,自動創建、打開、關閉和破壞連接,多個連接的創建,可滿足多客戶端的頻繁連接,連接的重復使用獲得最佳性能。
MySQL連接器
每三分鐘運行一次后臺作業,并從池中刪除閑置(未使用)超過三分鐘的連接。池清理釋放客戶端和服務器端的資源。這是因為在客戶端每個連接都使用一個Socket,而在服務器端每個連接都使用一個Socket和一個線程。

max_connections,MySQL最大并發連接數,默認值是151,最大連接數上限是16384;

經驗:實際連接數是最大連接數的 85% 較為合適。 設置 max_used_connections 方法

  • 查詢數據庫目前設置的最大并發連接數是多少
SHOW VARIABLES LIKE ‘max_connections’;
  • 查詢數據庫目前實際連接的并發數是多少
    SHOW STATUS LIKE ‘max_used_connections’;

  • 在MySQL配置文件 /etc/my.cnf 中設置 max_connections=3000,表示修改最大連接數為3000。

注意:需要重啟 MySQL 才能生效。 – MySQL為每個連接創建緩沖區,所以不應該盲目上調最大連接數。

如果最大連接數達到了上面設置的 3000,會消耗大約 800M 內存。

其他連接池設置:
開啟連接池: Pooling=true,默認開啟
復用時重置連接狀態: ConnectionReset=True
保持連接設置: CacheServerProperties=True
連接超時回收(秒): ConnectionLifeTime=300
支持的最大連接數量: Max Pool Size=100
保持最小的連接數量: Min Pool Size=10

2. 優化請求堆棧

back_log,存放執行請求的堆棧大小,默認值是50。

  • 該值設置為最大并發連接數的 20%~30% 較為合適。
    設置 back_log 方法:
  • 在MySQL配置文件 /etc/my.cnf 中,設置 back_log=600
  • 修改后需要重啟 MySQL 才能生效。

back_log 在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。
也就是說,如果MySql的連接數達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源。
將會報:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL |
login | NULL 的待連接進程時. back_log值不能超過TCP/IP連接的偵聽隊列的大小。
若超過則無效,查看當前系統的TCP/IP連接的偵聽隊列的大小命令:cat
/proc/sys/net/ipv4/tcp_max_syn_backlog,目前系統為1024。
對于Linux系統推薦設置為大于512的整數。 修改系統內核參數,可以編輯/etc/sysctl.conf去調整它。
如:net.ipv4.tcp_max_syn_backlog = 2048,改完后執行sysctl -p 讓修改立即生效。 查看mysql
當前系統默認back_log值,命令:
show variables like ‘back_log’;

3. 修改連接超時時間

wait-timeout,超時時間,單位是秒,連接默認超時為8小時,連接長期不用不銷毀,比較浪費資源。
查看

SHOW VARIABLES LIKE 'wait_timeout%';

經驗:設置超時時間為 10 分鐘 wait-timeout=600

4. 優化內存緩沖池

緩沖池運行機制

  • 在MySQL5.5之前,廣泛使用的和默認的存儲引擎是MyISAM。MyISAM使用操作系統緩存來緩存數據。InnoDB需要innodb buffer pool中處理緩存,所以非常需要有足夠的InnoDB buffer pool空間。
  • 緩沖區分為 熱數據區 / 冷數據區,兩者空間占比約為 7/3,每區中的數據集依使用頻率按順序依次排列。當一個新的查詢結果出現后,首先考慮存放到冷數據區,當冷數據區的結果集使用達到一定頻率,會被改存到熱數據區,使用頻率最好的數據集會被存放到熱區的首位,當然也有熱區轉到冷區的狀況。

InnoDB 緩沖池不僅僅是一個緩存,MySQL InnoDB buffer pool 包含四部分:
1. 數據緩存,InnoDB 數據頁面;
2. 索引緩存,索引數據;
3. 緩沖數據,臟頁(在內存中修改尚未寫入到磁盤的數據);
4. 內部結構,如自適應哈希索引,行鎖等。

innodb_buffer_pool_instances 內存緩沖池。

  • buffer_pool 把需要緩沖的數據 hash 到不同的緩沖池中,這樣可以并行的內存讀寫。通過減少爭用不同線程對緩存頁面進行讀寫的爭用,將緩沖池劃分為多個單獨的實例可以提高并發性。

  • MySQL 5.7、MySQL 8.0 下 innodb_buffer_pool_instances 默認為 1,若 MySQL 存在高并發和高負載訪問,設置為 1 則會造成大量線程對 buffer_pool 的單實例互斥鎖競爭,這樣會消耗一定量的性能的。

  • innodb_buffer_pool_instances 建議設置為 cpu核心數。
    innodb_buffer_pool_chunk_size,緩沖池每塊大小,默認128M。

  • pool_chunk_size 一般不做改動,使用默認值就可以。
    innodb_buffer_pool_size,緩沖池的承載總量。

  • innodb_buffer_pool_size 可以緩存索引和行數據,值越大、IO讀寫就越少;

設置規則:innodb_buffer_pool_size = (innodb_buffer_pool_chunk_size * {N}塊 )*innodb_buffer_pool_instances

如果單純的做數據庫服務,該參數可以設置到電腦物理內存的80%;
為了更好的配合 pool_instance,pool_size 需要設置為 pool_instance 和 pool_chunk_size 的整數倍,這樣可以被 pool_instance 整除,為每個 buffer pool 實例平均分配內存。如果設置的值不是倍數,MySQL會自動將 pool_size 調整為 pool_chunk_size 的倍數。

5. 優化并發線程數

innodb_thread_concurrency,代表并發線程數。
默認是0,表示沒有設置線程數量的上限。不是分配給 MySQL 的線程越多越好,線程多反而會損耗cpu性能,導致速度變慢。

經驗:并發線程數應該設置為 cpu 核心數的兩倍。

注意:這個變量特定于Solaris 8和更早的系統,MySQL 5.7.2中刪除了這個變量。

設置 innodb_thread_concurrency 方法:

在MySQL配置文件 /etc/my.cnf 中,設置 innodb_thread_concurrency=8。

– 查看cpu型號
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
– 查看cpu核心數
cat /proc/cpuinfo | grep “cores”|uniq

6. 優化線程池

客戶端發起連接到 MySQL Server 后,MySQL Server監聽進程監聽到新的請求,然后 Sever 會為其分配一個新的 thread去處理此請求。
從建立連接之開始,CPU要給它劃分一定的 thread stack,然后進行用戶身份認證,建立上下文信息,最后請求完成,關閉連接,同時釋放資源。
在高并發的情況下,這個過程將給系統帶來巨大的壓力,不能保證性能。MySQL服務器的線程數需要在一個合理的范圍之內,這樣才能保證MySQL服務器健康平穩地運行。

6.1 查看線程池的狀態:

mysql> show variables like ‘thread%;
±-------------------±--------------------------+
| Variable_name | Value |
±-------------------±--------------------------+
| thread_cache_size | 64 |
| thread_concurrency | 10 |
| thread_handling | one-thread-per-connection |
| thread_stack | 262144 |
±-------------------±--------------------------+

thread_cache_size

thread_cache_size,Threads_cached 中存放的最大連接線程數。

  • 在短連接的應用中,Threads_cached 的功效非常明顯,因為在應用中數據庫的連接和創建是非常頻繁的。如果不使用 Threads_cached,那么消耗的資源是非常頻繁的。
  • 在長連接中雖然帶來的改善沒有短連接的那么明顯,但是好處是顯而易見的。但并不是越大越好,大了反而浪費資源,這個的確定一般認為和物理內存有一定關系。
  • Mysql默認值為9。
    設置 thread_cache_size 方法:
  • 參考下面額對照表,根據物理內存設置對應的 thread_cache_size 數值:

1G —> 8
2G —> 16
3G —> 32
3G —> 64

6.2 在 mysql 命令行中設置:

mysql> set global thread_cache_size=64

thread_concurrency

  • thread_concurrency 應設為 CPU核數的2倍。
    比如有一個雙核的CPU,那么thread_concurrency的應該為4。這個變量是針對Solaris系統的,如果設置這個變量的話,mysqld就會調用thr_setconcurrency()。這個函數使應用程序給同一時間運行的線程系統提供期望的線程數目。但是在5.7以后就已經拋棄了。
    設置 thread_concurrency 方法:
    – 在 mysql 命令行中設置:
mysql> set global thread_concurrency=4

thread_handling

運用 Thread_Cache 處理連接的方式,從 5.1.19 添加的新特性,有兩個值可選 no-threads、one-thread-per-connection。

  • no-threads :服務器使用一個線程
  • one-thread-per-connection :服務器為每個客戶端請求使用一個線程

thread_stack

每個連接被創建的時候,mysql分配給它的內存。這個值一般認為默認就可以應用于大部分場景了,除非必要非則不要動它。上面表示是256kb。

6.2 查看線程使用情況:

mysql> show global status like ‘Thread%;
±------------------±------+
| Variable_name | Value |
±------------------±------+
| Threads_cached | 41 |
| Threads_connected | 53 |
| Threads_created | 541 |
| Threads_running | 4 |
±------------------±------+
Threads_cached

MySQL里面為了提高客戶端請求創建連接過程的性能,提供了一個連接池也就是 Thread_cache 池(大小是thread_cache_size),將空閑的連接線程放在連接池中,而不是立即銷毀。
這樣的好處就是,當又有一個新的請求的時候,mysql不會立即去創建連接 線程,而是先去 Thread_Cache 中去查找空閑的連接線程,如果存在則直接使用,不存在才創建新的連接線程。Thread_cache 值表示已經被線程緩存池緩存的線程個數。

Threads_connected

當前處于連接狀態的線程個數,等于 show processlist。

Threads_created

Threads_created 表示創建過的線程數,如果發現 Threads_created 值過大的話,表明MySQL服務器一直在創建線程,這也是比較耗資源,可以適當增加配置文件中 thread_cache_size 值。

Threads_running

處于激活狀態的線程的個數,這個一般都是遠小于Threads_connected的。

7.優化日志

日志運行機制
MySQL在運行時,會有各種不同日志的記錄,大量的各種類型的日志產生,會對資源的開銷產生嚴重的影響,必要的時候我們選擇性的開啟。
但在生產環境時,有些日志并不是必須,以下列出MySQL各種日志信息:

  • 錯誤日志:啟動、關閉、運行時 產生的異常記錄,建議開啟,設置 log_error
    查詢日志:客戶端連接和執行的腳本,建議關閉,設置 general_log
  • 慢查詢日志:記錄超時的查詢,記錄不適用索引的查詢等,建議關閉,設置 slow_query_log
  • 二進制日志:用于數據同步復制,需發送的數據日志,多用于集群,如需開啟,設置 log_bin
  • 中繼日志:用于數據同步復制時,接收到的數據日志,多用于集群,如需開啟,設置 relay_log

8. 鎖優化

8.1. innodb 鎖優化

Innodb 存儲引擎由于實現了行級鎖定,雖然在鎖定機制的實現方面所帶來的性能損耗可能比表級鎖定會要更高一些,但是在整體并發處理能力方面要遠遠優于MyISAM 的表級鎖定的。

盡可能讓所有的數據檢索都通過索引來完成,從而避免Innodb 因為無法通過索引鍵加鎖而升級為表級鎖定;
合理設計索引,讓Innodb 在索引鍵上面加鎖的時候盡可能準確,盡可能的縮小鎖定范圍,避免造成不必要的鎖定而影響其他Query 的執行;
盡可能減少基于范圍的數據檢索過濾條件,避免因為間隙鎖帶來的負面影響而鎖定了不該鎖定的記錄;
盡量控制事務的大小,減少鎖定的資源量和鎖定時間長度;
在業務環境允許的情況下,盡量使用較低級別的事務隔離,以減少MySQL 因為實現事務隔離級別所帶來的附加成本;
減少 innodb 死鎖產生概率的建議:
類似業務模塊中,盡可能按照相同的訪問順序來訪問,防止產生死鎖;
在同一個事務中,盡可能做到一次鎖定所需要的所有資源,減少死鎖產生概率;
對于非常容易產生死鎖的業務部分,可以嘗試使用升級鎖定顆粒度,通過表級鎖定來減少死鎖產生的概率;

9.2. MyISAM 鎖優化

在MyISAM里讀寫操作是串行的,但當對同一個表進行查詢和插入操作時,為了降低鎖競爭的頻率,根據concurrent_insert的設置,MyISAM是可以并行處理查詢和插入的

縮短鎖定時間

  • 盡兩減少大的復雜Query,將復雜Query 分拆成幾個小的Query 分布進行;

  • 盡可能的建立足夠高效的索引,讓數據檢索更迅速;

  • 盡量讓MyISAM 存儲引擎的表只存放必要的信息,控制字段類型;

  • 利用合適的機會優化MyISAM 表數據文件;

  • max_write_lock_count:
    缺省情況下,寫操作的優先級要高于讀操作的優先級,即便是先發送的讀請求,后發送的寫請求,此時也會優先處理寫請求,然后再處理讀請求。這就造成一 個問題:一旦我發出若干個寫請求,就會堵塞所有的讀請求,直到寫請求全都處理完,才有機會處理讀請求。此時可以考慮使用 max_write_lock_count:
    max_write_lock_count=1
    有了這樣的設置,當系統處理一個寫操作后,就會暫停寫操作,給讀操作執行的機會。
    low-priority-updates:
    我們還可以更干脆點,直接降低寫操作的優先級,給讀操作更高的優先級。
    low-priority-updates=1
    綜合來看,concurrent_insert=2是絕對推薦的,至于max_write_lock_count=1和low-priority- updates=1,則視情況而定,如果可以降低寫操作的優先級,則使用low-priority-updates=1,否則使用 max_write_lock_count=1。
    set-variable = max_allowed_packet=1M
    set-variable = net_buffer_length=2K

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

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

相關文章

C++算法 —— 貪心(4)

文章目錄 1、分發餅干2、最優除法3、跳躍游戲Ⅱ4、跳躍游戲Ⅰ5、加油站6、單調遞增的數字7、壞了的計算器 1、分發餅干 455. 分發餅干 其實看完這個題會發現,如果給定的兩個數組不排序的話會非常難受,所以無論怎樣,先排序。接下來需要比較兩…

項目管理套路:看這一篇絕對夠用??

寫論文必不可少的,就是創建代碼并進行實驗。好的項目管理可以讓實驗進行得更加順利。本篇博客以一次項目實踐為例,介紹項目管理的方法,以及可能遇到的問題,并提供一些可行的解決方案。 目錄 項目管理工具開始第一步版本管理十分關…

GB/T 32223-2015 建筑門窗五金件檢測

建筑門窗五金件包括操縱部件(傳動機構用執手、旋轉執手、雙面執手、單點鎖閉器)、承載部件(合頁,鉸鏈、滑撐、滑輪)、傳動啟閉部件(傳動鎖閉器、多點鎖閉器、插銷)、輔助部件(撐擋、…

【JavaWeb】TomcatJavaWebHTTP

Tomcat&JavaWeb&HTTP 文章目錄 Tomcat&JavaWeb&HTTP一、Tomcat1.1 版本選擇及安裝1.2 目錄1.3 WEB項目部署的方式 二、IDEA中Java Web開發部署流程三、HTTP協議3.1 發展歷程3.2 HTTP協議的會話方式3.3 請求報文3.4 響應報文 一、Tomcat Tomcat是Apache 軟件基…

php xml數據轉數組兩種方式

目錄 方法一、可以使用simplexml_load_string()函數將XML數據轉換為數組。 方法二、使用PHP內置的DOMDocument類來將XML數據轉換為數組的方法 方法一、可以使用simplexml_load_string()函數將XML數據轉換為數組。 $xmlData <root><name>John Doe</name>&l…

NX二次開發UF_CSYS_create_matrix 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CSYS_create_matrix Defined in: uf_csys.h int UF_CSYS_create_matrix(const double matrix_values [ 9 ] , tag_t * matrix_id ) overview 概述 Creates a 3 x 3 matrix. 創建…

nodejs+vue+python+PHP+微信小程序-青云商場管理系統的設計與實現-安卓-計算機畢業設計

研究步驟、措施&#xff1a; &#xff08;1&#xff09;與指導老師確定系統主要功能&#xff1b; &#xff08;2&#xff09;做需求分析及功能模塊劃分&#xff1b; &#xff08;3&#xff09;指導老師通過后&#xff0c;設計出用例圖&#xff0c;E-R圖&#xff0c;功能模塊圖 …

【XSLVGL2.0】如何新增一種語言和詞條

XSLVGL2.0 開發手冊 【XSLVGL2.0】如何新增一種語言和詞條 1、概述2、以外置資源的方式增加詞條3、以內置資源的方式增加詞條4、使用方法1、概述 本文件旨在介紹新增一種語言詞條的方法 2、以外置資源的方式增加詞條 假設項目需要增加一種英文的詞條。一般地,我們采用國際…

Git-將指定文件回退到指定版本

場景1&#xff1a;修改了文件/path/to/file&#xff0c;沒有提交&#xff0c;但是覺得改的不好&#xff0c;想還原。 解決&#xff1a; git checkout -- /path/to/file 場景2&#xff1a;修改了文件/path/to/file&#xff0c;已經提交&#xff0c;但是覺得改的不好&#xff0c…

老牌開源 SVG 編輯器 SVGEdit 是如何架構的?

大家好&#xff0c;我是前端西瓜哥。這次簡單看看 SVGEdit 的架構。 SVGEdit 的版本為 7.2.0。 SVGEdit 一款非常老牌的 SVG 圖形編輯器&#xff0c;用于編輯處理 SVG&#xff0c;start 數目前是 5.8k。 它的優點在于經過多年的開發&#xff0c;完成度高&#xff0c;較為成熟&a…

大眾博客系統測試報告【改】

一、項目背景 大眾博客系統采用前后端分離的方法來實現&#xff0c;同時使用了數據庫來存儲相關的數據&#xff0c;同時將其部署到云服務器上。前端主要有四個頁面構成&#xff1a;登錄頁、列表頁、詳情頁以及編輯頁&#xff0c;以上模擬實現了最簡單的大眾博客系統。其結合后端…

Tars-GO 開發

默認環境是安裝好的 創建服務: tarsgo make App Server Servant GoModuleName Tars 實例的名稱&#xff0c;有三個層級&#xff0c;分別是 App&#xff08;應用&#xff09;、Server&#xff08;服務&#xff09;、Servant&#xff08;服務者&#xff0c;有時也稱 Object&am…

LeetCode Hot100 74.搜索二維矩陣

題目&#xff1a; 給你一個滿足下述兩條屬性的 m x n 整數矩陣&#xff1a; 每行中的整數從左到右按非嚴格遞增順序排列。每行的第一個整數大于前一行的最后一個整數。 給你一個整數 target &#xff0c;如果 target 在矩陣中&#xff0c;返回 true &#xff1b;否則&#x…

數據結構——堆的實現

堆的實現-----C語言版 目錄&#xff1a;一、堆的實現1.1堆的定義1.2堆的實現1.2.1堆的各個接口1.2.2堆的向上調整1.2.3堆的向下調整1.2.4堆的定義聲明和初始化1.2.5堆的數據處理1.2.6堆的判空和堆的數據個數以及堆銷毀1.2.7堆的代碼實現 二、TOP—K問題 目錄&#xff1a; 一、…

C++ 文件和流、異常處理、動態內存、預處理器

一、C文件和流&#xff1a; 在C中進行文件處理&#xff0c;需要包含頭文件<iostream>和<fstream>。fstream標準庫定義的三個新的數據類型&#xff1a; 數據類型 描述 ofstream 該數據類型表示輸出文件流&#xff0c;用于創建文件并向文件寫入信息。 ifstream …

vscode項目推送到git

1、打開項目文件 打開文件后點擊vs code左側工具欄中第三個源代碼管理圖標&#xff0c;點擊初始化倉庫&#xff0c;此時會創建一個本地倉庫會檢查該項目中的文件變更 2、創建遠程倉庫 點擊克隆/下載&#xff0c;復制HTTPS地址 3、添加遠程地址 1&#xff09;圖形化操作 2…

Leetcode刷題之用隊列實現棧(C語言版)

Leetcode刷題之用隊列實現棧&#xff08;C語言版&#xff09; 一、題目描述二、題目要求三、題目示例四、題目解析Ⅰ、MyStack* myStackCreateⅡ、void myStackPush(MyStack* obj, int x)Ⅲ、int myStackPop(MyStack* obj)Ⅳ、int myStackTop(MyStack* obj)Ⅴ、bool myStackEmp…

文件夾重命名:徹底擺脫數字困擾,批量修改文件夾名去除數字

在日常生活和工作中&#xff0c;經常會遇到需要修改文件夾名稱的情況。有時候是因為文件夾名稱中包含了數字&#xff0c;有時候是因為文件夾名稱不符合規范。無論出于什么原因&#xff0c;修改文件夾名稱都是一件非常繁瑣的事情。尤其是需要修改大量文件夾名稱時&#xff0c;手…

Jenkins 整合 Docker 自動化部署

Docker 安裝 Jenkins 配置自動化部署 1. Docker 安裝 Jenkins 1.1 拉取鏡像文件 docker pull jenkins/jenkins1.2 創建掛載文件目錄 mkdir -p $HOME/jenkins_home1.3 啟動容器 docker run -d -p 8080:8080 -v $HOME/jenkins_home:/var/jenkins_home --name jenkins jenkin…

CentOS rpm安裝Nginx和配置

CentOS rpm安裝Nginx和配置 官方下載地址: http://nginx.org/en/download.html 介紹 Nginx(“engine x”)是一款由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理 服務器&#xff0c;也是一個 IMAP/POP3/SMTP 代理服務器。 rpm包安裝 #安裝nginx&#xff0c…