前言
作為一名運維,工作中跟MySQL打交道一定少不了,那么當面試官問,你是如何優(yōu)化MySQL的,想必你心中多多少少會有答案。今天我就總結(jié)一下常用的調(diào)優(yōu)方法。
架構(gòu)層面
俗話說,眾人拾柴火焰高。當一臺MySQL頂不住時,我們就增加一臺或者多臺唄。最簡單的方法,就是做一個主從架構(gòu),然后給它加一層代理(如mysql-proxy),然后設(shè)置其讀寫分離,將讀和寫分開,當讀操作時,可以到所有MySQL服務器上去請求,從而實現(xiàn)負載均衡。 再高級一點,將單臺MySQL做成MySQL Cluster模式,也會提升整體性能。
系統(tǒng)層面
增加內(nèi)存,MySQL服務是比較耗費內(nèi)存的,將內(nèi)存加大,然后調(diào)整其參數(shù),從而使其處理更多請求;
給磁盤做raid10或者raid5以增加磁盤的讀寫速度;
可以重新掛載磁盤,并加上noatime參數(shù),這樣可以減少磁盤的i/o;
MySQL自身層面
如果未配置主從同步,可以把bin-log功能關(guān)閉,減少磁盤i/o;
在my.cnf中加上skip-name-resolve,這樣可以避免由于解析主機名延遲造成mysql執(zhí)行慢;
調(diào)整幾個關(guān)鍵的buffer和cache。調(diào)整的依據(jù),主要根據(jù)數(shù)據(jù)庫的狀態(tài)來調(diào)試;
針對某些數(shù)據(jù)量很大的庫或者表,進行分開分表,從而使其查詢速度更快;
應用層面
查看慢查詢?nèi)罩?,根?jù)慢查詢?nèi)罩緝?yōu)化程序中的SQL語句,比如增加索引。首先要保證慢查詢?nèi)罩疽呀?jīng)配置:
slow_query_log= ON #開啟慢查詢?nèi)罩?slow_query_log_file=/data/mysql/slow.log #慢查詢?nèi)罩韭窂?long_query_time=1#查詢超過多少秒就會記錄日志
buffer和cache
key_buffer_size 首先可以根據(jù)系統(tǒng)的內(nèi)存大小設(shè)定它,大概的一個參考值:1G以下內(nèi)存設(shè)定128M;2G/256M; 4G/384M;8G/1024M;16G/2048M。這個值可以通過檢查狀態(tài)值Key_read_requests和Key_reads,可以知道key_buffer_size設(shè)置是否合理。比例key_reads / key_read_requests應該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE 'key_read%'獲得)。注意:該參數(shù)值設(shè)置的過大反而會使服務器整體效率降低!
table_open_cache 打開一個表的時候,會臨時把表里面的數(shù)據(jù)放到這部分內(nèi)存中,一般設(shè)置成1024就夠了,它的大小我們可以通過這樣的方法來衡量:如果你發(fā)現(xiàn) open_tables等于table_cache,并且opened_tables在不斷增長,那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE 'Open%tables'獲得)。注意,不能盲目地把table_cache設(shè)置成很大的值。如果設(shè)置得太高,可能會造成文件描述符不足,從而造成性能不穩(wěn)定或者連接失敗。
sort_buffer_size 查詢排序時所能使用的緩沖區(qū)大小,該參數(shù)對應的分配內(nèi)存是每連接獨占!如果有100個連接,那么實際分配的總共排序緩沖區(qū)大小為100 × 4 = 400MB。所以,對于內(nèi)存在4GB左右的服務器推薦設(shè)置為4-8M。
read_buffer_size 讀查詢操作所能使用的緩沖區(qū)大小。和sort_buffer_size一樣,該參數(shù)對應的分配內(nèi)存也是每連接獨享!
join_buffer_size 聯(lián)合查詢操作所能使用的緩沖區(qū)大小,和sort_buffer_size一樣,該參數(shù)對應的分配內(nèi)存也是每連接獨享!
myisam_sort_buffer_size 這個緩沖區(qū)主要用于修復表過程中排序索引使用的內(nèi)存或者是建立索引時排序索引用到的內(nèi)存大小,一般4G內(nèi)存給64M即可。
query_cache_size MySQL查詢操作緩沖區(qū)的大小,通過以下做法調(diào)整:SHOW STATUS LIKE 'Qcache%'; 如果Qcache_lowmem_prunes該參數(shù)記錄有多少條查詢因為內(nèi)存不足而被移除出查詢緩存。通過這個值,用戶可以適當?shù)卣{(diào)整緩存大小。如果該值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況,需要增加緩存大小;Qcache_free_memory:查詢緩存的內(nèi)存大小,通過這個參數(shù)可以很清晰的知道當前系統(tǒng)的查詢內(nèi)存是否夠用,是多了,還是不夠用,我們可以根據(jù)實際情況做出調(diào)整。一般情況下4G內(nèi)存設(shè)置64M足夠了。
thread_cache_size 表示可以重新利用保存在緩存中線程的數(shù),參考如下值:1G —> 8 2G —> 16 3G —> 32 3G —> 64。
除此之外,還有幾個比較關(guān)鍵的參數(shù):
thread_concurrency 這個值設(shè)置為cpu核數(shù)的2倍即可。
wait_timeout 表示空閑的連接超時時間,默認是28800s,這個參數(shù)是和interactive_timeout一起使用的,也就是說要想讓wait_timeout 生效,必須同時設(shè)置interactive_timeout,建議他們兩個都設(shè)置為10。
max_connect_errors 是一個MySQL中與安全有關(guān)的計數(shù)器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況。與性能并無太大關(guān)系。為了避免一些錯誤我們一般都設(shè)置比較大,比如說10000。
max_connections 最大的連接數(shù),根據(jù)業(yè)務請求量適當調(diào)整,設(shè)置500足夠
max_user_connections 是指同一個賬號能夠同時連接到mysql服務的最大連接數(shù)。設(shè)置為0表示不限制。通常我們設(shè)置為100足夠。
審核編輯:劉清
-
MySQL
+關(guān)注
關(guān)注
1文章
813瀏覽量
26598 -
cache技術(shù)
+關(guān)注
關(guān)注
0文章
41瀏覽量
1064
原文標題:你是如何優(yōu)化MySQL的
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論