當mysql遇到高併發時,可能會遇到不曾遇到的瓶頸。
一、innodb併發配置
innodb是為高效能設計的,在最近幾年他的提公升非常明顯,但依然不完美。
innodb有自己的 「執行緒排程器」控制線程怎麼進入核心訪問資料,以及他們在核心中一次可以做哪些事情。最基本的限制併發的方式是使用innodb_thread_concurrency變數,它會限制一次性可以有多少個執行緒進入核心,0表示不限制。
理論上,下面的公式可以給出乙個這樣的值
併發值 = cpu數量 * 磁碟數量 * 2
但是在實踐中,使用更小的值會更好一點,必須做實驗來找出合適系統的最好值。
如果已經進入核心的執行緒超過了允許的數量,新的執行緒就無法進入核心。
innodb使用兩段處理來嘗試讓執行緒盡可能高校的進入核心。兩段策略減少了減少了因為作業系統排程引起的切換。執行緒第一次休眠innodb_thread_sleep_delay微妙,然後再重試進入核心,如果依然不能進入核心,則放入乙個等待執行緒佇列,讓作業系統來處理。
第一階段的預設休眠時間是10000微秒,當cpu有大量的執行緒處在「進入佇列前的休眠」狀態,因而沒有被充分利用時,改變這個值在高併發環境裡可能會有幫助,特別是有大量小查詢時。
一旦執行緒進入核心,他會有一定數量的「票據(tickets)」,可以讓它「免費」返回核心,不需要再做併發檢查。innodb_concurrency_tickets選項控制票據的數量,很少需要改動,除非有很多執行時間極長的查詢。
還有另乙個提交階段的併發瓶頸,這個時候i/o非常密集,因為需要做重新整理操作。innodb_commit_concurrency變數控制有多少個執行緒可以在同一時間提交,如果執行緒衝突比較多,可以修改這個值。
有乙個新的方法是使用執行緒池來限制併發,mariadb已經實現了,並且oracle乙個商業外掛程式可以為mysql5.5提供執行緒池功能。
二、myisam併發配置
某些條件下myisam也允許併發插入和讀取,但是首先要理解myisam是怎樣刪除和插入行的。
myisam的刪除操作不會重新整理整個表,它們只是把行標記為刪除,在表中留下「空洞」。myisam在插入時重新利用填滿這些空洞,如果沒有空洞,就把新行插到表的末尾。
儘管myisam是表級鎖,它依然可以一邊讀取,一邊併發追加新行,這中情況只能讀取到查詢開始時的所有資料,新插入的資料是不可見的,這樣避免不一致讀。
然而,若表中間的某些資料變動了的話,還是難以提供一致讀。mvcc解決了這個問題,通過版本號來校驗,但是myisam並不支援,所以除非插入操作在表的結尾,否則不能支援併發插入。
通過設定concurrent_insert這個變數,可以配置myisam開啟併發插入,可以配如下的值
0:不允許併發插入,所有插入都會對錶加互斥鎖。
1:預設值,只要表中沒有空洞,myisam就允許併發插入。
2:mysql5.0以後有效,強制併發插入到表的末尾,即使表中有空洞。如果沒有執行緒從表讀取資料,mysql將把新行放到空洞裡,使用這個設定通常使表更加碎片化。
三、負載配置
當伺服器在滿載的情況下執行時,請嘗試記錄所有的查詢語句,因為這是最好的方式來檢視占用資源情況。
優化blob和text的場景blob和text對mysql來說是特殊的型別,乙個最重要的事項是,伺服器不能在記憶體臨時表中存放blob和text值,percona server沒有這個限制,因此如果乙個查詢涉及到blob和text,又需要使用臨時表,都會立即在磁碟上建立臨時表。
通常使用substring()函式把值轉換為varchar可以好一點。
對於innodb來說,如果有很多大字段,最好是把他們組合一起來單獨存到乙個列裡面,共享乙個擴充套件空間,比每個欄位用自己的空間要好。也可以用compress壓縮後再儲存為blob和text。
當mysql必須排序blob和text欄位時,它只會使用字首,max_sort_length可以制定這個字首有多大。
高效能的MySQL(8)優化伺服器配置一記憶體
配置mysql伺服器離不開配置檔案,接下來就開始這一部分的內容。首先一定要清楚配置檔案的位置,如果不知道可以嘗試下面的操作 1 2 3 4 usr local mysql bin mysqld verbose help grep a 1 default options 結果如下 default op...
優化伺服器設定 高效能MySQL
mysql有大量可以修改的引數 但不應該隨便去修改。通常只需要把基本的項配置正確 大部分情況下只有很少一些引數是真正重要的 應該將更多的時間花在schema的優化 索引,以及查詢設計上。在正確地配置了mysql的基本配置項之後,再花力氣去修改其它配置項的收益通常就比較小了。1.建立mysql配置檔案...
高效能Mysql 伺服器效能剖析
1 如何確認伺服器是否達到了最佳效能狀態 2 找出某條sql語句為什麼不夠快 3 間歇性疑難故障 解決方案就是測量伺服器的時間花費在 使用的技術則是效能剖析 profiling 效能的定義是完成某個任務所花費的時間,資料庫的目的是執行sql語句。什麼是優化?降低cpu利用率?不是,資源是用來消耗並用...