mysql server 配置優化

2021-05-24 21:28:18 字數 4925 閱讀 7233

mysql伺服器的後台管理程式,要想使用客戶端程式,該程式必須執行,因為客戶端通過連線伺服器來訪問資料庫。下面讓我們以伺服器的系統變數和狀態變數為根據,優化我們的mysql資料庫服務。

在這之前,我們需要掌握以下方法:

檢視mysql狀態及變數的方法:

mysql> show status ——顯示狀態資訊(擴充套件show status like '***')

mysql> show variables ——顯示系統變數(擴充套件show variables like '***')

mysql> show innodb status ——顯示innodb儲存引擎的狀態

shell> mysqladmin variables -u username -p password——顯示系統變數

shell> mysqladmin extended-status -u username -p password——顯示狀態資訊

檢視狀態變數及幫助:

shell> mysqld --verbose --help [|more #逐行顯示]

首先,讓我們看看有關請求連線的變數:

為了能適應更多資料庫應用使用者,mysql提供了連線(客戶端)變數,以對不同性質的使用者群體提供不同的解決方案,筆者就max_connections,back_log做了一些細結,如下:

max_connections是指mysql的最大連線數,如果伺服器的併發連線請求量比較大,建議調高此值,以增加並行連線數量,當然這建立在機器能支撐的情況下,因為如果連線數越多,介於mysql會為每個連線提供連線緩衝區,就會開銷越多的記憶體,所以要適當調整該值,不能盲目提高設值。可以過'conn%'萬用字元檢視當前狀態的連線數量,以定奪該值的大小。

back_log是要求mysql能有的連線數量。當主要mysql執行緒在乙個很短時間內得到非常多的連線請求,這就起作用,然後主線程花些時間(儘管很短)檢查連線並且啟動乙個新執行緒。back_log值指出在mysql暫時停止回答新請求之前的短時間內多少個請求可以被存在堆疊中。如果期望在乙個短時間內有很多連線,你需要增加它。也就是說,如果mysql的連線資料達到max_connections時,新來的請求將會被存在堆疊中,以等待某一連線釋放資源,該堆疊的數量即back_log,如果等待連線的數量超過back_log,將不被授予連線資源。另外,這值(back_log)限於您的作業系統對到來的tcp/ip連線的偵聽佇列的大小。你的作業系統在這個佇列大小上有它自己的限制(可以檢查你的os文件找出這個變數的最大值),試圖設定back_log高於你的作業系統的限制將是無效的。

優化了mysql的連線後屬性後,我們需要看看緩衝區變數:

使用mysql資料庫儲存大量資料(或使用複雜查詢)時,我們應該考慮mysql的記憶體配置。如果配置mysql伺服器使用太少的記憶體會導致效能不是最優的;如果配置了太多的記憶體則會導致崩潰,無法執行查詢或者導致交換操作嚴重變慢。在現在的32位平台下,仍有可能把所有的位址空間都用完,因此需要審視。

計算記憶體使用的秘訣公式就能相對地解決這一部分問題。不過,如今這個公式已經很複雜了,更重要的是,通過它計算得到的值只是「理論可能」並不是真正消耗的值。事實上,有8gb記憶體的常規伺服器經常能執行到最大的理論值(100gb甚至更高)。此外,你輕易不會使用到「超額因素」(它實際上依賴於應用以及配置)。一些應用可能需要理論記憶體的10%而有些僅需1%。

那麼,我們可以做什麼呢?

來看看那些在啟動時就需要分配並且總是存在的全域性緩衝吧!

全域性緩衝:

key_buffer_size, innodb_buffer_pool_size, innodb_additional_mem_pool_size,innodb_log_buffer_size, query_cache_size

注:如果你大量地使用myisam表,那麼你也可以增加作業系統的快取空間使得mysql也能用得著。把這些也都加到作業系統和應用程式所需的記憶體值之中,可能需要增加32mb甚至更多的記憶體給mysql伺服器**以及各種不同的小靜態緩衝。這些就是你需要考慮的在mysql伺服器啟動時所需的記憶體。其他剩下的記憶體用於連線。

key_buffer_size決定索引處理的速度,尤其是索引讀的速度。一般我們設為16m,通過檢查狀態值key_read_requests和key_reads,可以知道key_buffer_size設定是否合理。比例key_reads / key_read_requests應該盡可能的低,至少是1:100,1:1000更好(上述狀態值可以使用'key_read%'獲得用來顯示狀態資料)。key_buffer_size只對myisam表起作用。即使你不使用myisam表,但是內部的臨時磁碟表是myisam表,也要使用該值。可以使用檢查狀態值'created_tmp_disk_tables'得知詳情。

innodb_buffer_pool_size對於innodb表來說,作用就相當於key_buffer_size對於myisam表的作用一樣。innodb使用該引數指定大小的記憶體來緩衝資料和索引。對於單獨的mysql資料庫伺服器,最大可以把該值設定成物理記憶體的80%。

innodb_additional_mem_pool_size指定innodb用來儲存資料字典和其他內部資料結構的記憶體池大小。預設值是1m。通常不用太大,只要夠用就行,應該與表結構的複雜度有關係。如果不夠用,mysql會在錯誤日誌中寫入一條警告資訊。

innodb_log_buffer_size指定innodb用來儲存日誌資料的快取大小,如果您的表操作中包含大量併發事務(或大規模事務),並且在事務提交前要求記錄日誌檔案,請盡量調高此項值,以提高日誌效率。

query_cache_size是mysql的查詢緩衝大小。(從4.0.1開始,mysql提供了查詢緩衝機制)使用查詢緩衝,mysql將select語句和查詢結果存放在緩衝區中,今後對於同樣的select語句(區分大小寫),將直接從緩衝區中讀取結果。根據mysql使用者手冊,使用查詢緩衝最多可以達到238%的效率。通過檢查狀態值』qcache_%』,可以知道query_cache_size設定是否合理:如果qcache_lowmem_prunes的值非常大,則表明經常出現緩衝不夠的情況,如果qcache_hits的值也非常大,則表明查詢緩衝使用非常頻繁,此時需要增加緩衝大小;如果qcache_hits的值不大,則表明你的查詢重複率很低,這種情況下使用查詢緩衝反而會影響效率,那麼可以考慮不用查詢緩衝。此外,在select語句中加入sql_no_cache可以明確表示不使用查詢緩衝。

除了全域性緩衝,mysql還會為每個連線發放連線緩衝。

read_buffer_size是mysql讀入緩衝區大小。對錶進行順序掃瞄的請求將分配乙個讀入緩衝區,mysql會為它分配一段記憶體緩衝區。read_buffer_size變數控制這一緩衝區的大小。如果對錶的順序掃瞄請求非常頻繁,並且你認為頻繁掃瞄進行得太慢,可以通過增加該變數值以及記憶體緩衝區大小提高其效能。

sort_buffer_size是mysql執行排序使用的緩衝大小。如果想要增加order by的速度,首先看是否可以讓mysql使用索引而不是額外的排序階段。如果不能,可以嘗試增加sort_buffer_size變數的大小。

read_rnd_buffer_size是mysql的隨機讀緩衝區大小。當按任意順序讀取行時(例如,按照排序順序),將分配乙個隨機讀快取區。進行排序查詢時,mysql會首先掃瞄一遍該緩衝,以避免磁碟搜尋,提高查詢速度,如果需要排序大量資料,可適當調高該值。但mysql會為每個客戶連線發放該緩衝空間,所以應盡量適當設定該值,以避免記憶體開銷過大。

tmp_table_size是mysql的heap(堆積)表緩衝大小。所有聯合在乙個dml指令內完成,並且大多數聯合甚至可以不用臨時錶即可以完成。大多數臨時表是基於記憶體的(heap)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含blob列的表儲存在硬碟上。如果某個內部heap(堆積)表大小超過tmp_table_size,mysql可以根據需要自動將記憶體中的heap表改為基於硬碟的myisam表。還可以通過設定tmp_table_size選項來增加臨時表的大小。也就是說,如果調高該值,mysql同時將增加heap表的大小,可達到提高聯接查詢速度的效果。

當我們設定好了緩衝區大小之後,再來看看:

table_cache所有執行緒開啟的表的數目,增大該值可以增加mysqld需要的檔案描述符的數量。每當mysql訪問乙個表時,如果在表緩衝區中還有空間,該錶就被開啟並放入其中,這樣可以更快地訪問表內容。通過檢查峰值時間的狀態值』open_tables』和』opened_tables』,可以決定是否需要增加table_cache的值。如果你發現open_tables等於table_cache,並且opened_tables在不斷增長,那麼你就需要增加table_cache的值了(上述狀態值可以使用』open%tables』獲得)。注意,不能盲目地把table_cache設定成很大的值。如果設定得太高,可能會造成檔案描述符不足,從而造成效能不穩定或者連線失敗。

做了以上方面的調優設定之後,mysql應該基本能滿足您需求(當然是建立在調優設定適當的情況下),我們還應該了解並注意:

只有簡單查詢oltp(聯機事務處理)應用的記憶體消耗經常是使用預設緩衝的每個執行緒小於1mb,除非需要使用複雜的查詢否則無需增加每個執行緒的緩衝大小。使用1mb的緩衝來對10行記錄進行排序和用16mb的緩衝基本是一樣快的(實際上16mb可能會更慢,不過這是其他方面的事了)。

找出mysql伺服器記憶體消耗的峰值。這很容易就能計算出作業系統所需的記憶體、檔案快取以及其他應用。在32位環境下,還需要考慮到32位的限制,限制 「mysqld」 的值大約為2.5g(實際上還要考慮到很多其他因素)。現在執行 「ps aux」 命令來檢視 「vsz」 的值(mysql 程序分配的虛擬記憶體)。監視著記憶體變化的值,就能知道是需要增加或減少當前的記憶體值了。

最後來看看調優設定方法:

安裝好mysql後,配製檔案應該在 ./share/mysql ("./"即mysql安裝目錄) 目錄中,配製檔案有幾個,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf。win環境下即存在於mysql安裝目錄中的.ini檔案。不同的流量的**和不同配製的伺服器環境,當然需要有不同的配製檔案了。

一般的情況下,my-medium.cnf這個配製檔案就能滿足我們的大多需要;一般我們會把配置檔案拷貝到 /etc/my.cnf ,win環境下則拷備到 my.ini 下即可,只需要修改這個配置檔案就可以了。 

ubuntu 安裝mysql server配置

ubuntu 安裝mysql server 的安裝和配置步驟如下 1.安裝 mysql server命令 sudo apt get install mysql server2.等待安裝完後,接下來開始配置 2 其他機器訪問 mysql 配置 a.sudo vim etc mysql.my.cnf 找...

無法遠端登入MySQL Server

登入出現1130 is not allowed to connect to this mysql server問題,解決方法如下 你想root使用者名稱使用root密碼從任何主機連線到mysql伺服器的話。grant all privileges on to root identified by r...

mysql server啟動 mysql的啟動方式

mysql的啟動方式有4種 mysqld mysql safe mysql multi service mysql start 1.mysqld 是mysql的核心程式,用於管理mysql的資料庫檔案以及使用者的請求操作。mysqld可以讀取配置檔案中的 mysqld 的部分 mysqld user...