Linux高负载下优化MYSQL(一)
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
?安裝好mysql后,配制文件應(yīng)該在/usr/local/mysql/share/mysql目錄中,配制文件有幾個,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的網(wǎng)站和不同配制的服務(wù)器環(huán)境,當(dāng)然需要有不同的配制文件了。
一般的情況下,my-medium.cnf這個配制文件就能滿足我們的大多需要;一般我們會把配置文件拷貝到/etc/my.cnf 只需要修改這個配置文件就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的參數(shù),有3個配置參數(shù)是最重要的,即key_buffer_size,query_cache_size,table_cache。
key_buffer_size只對MyISAM表起作用,
key_buffer_size指定索引緩沖區(qū)的大小,它決定索引處理的速度,尤其是索引讀的速度。一般我們設(shè)為16M,實際上稍微大一點的站點 這個數(shù)字是遠(yuǎn)遠(yuǎn)不夠的,通過檢查狀態(tài)值Key_read_requests和Key_reads,可以知道key_buffer_size設(shè)置是否合理。比例 key_reads / key_read_requests應(yīng)該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。 或者如果你裝了phpmyadmin 可以通過服務(wù)器運行狀態(tài)看到,筆者推薦用phpmyadmin管理mysql,以下的狀態(tài)值都是本人通過phpmyadmin獲得的實例分析:
這個服務(wù)器已經(jīng)運行了20天
key_buffer_size – 128M
key_read_requests – 650759289
key_reads - 79112
比例接近1:8000 健康狀況非常好
另外一個估計key_buffer_size的辦法 把你網(wǎng)站數(shù)據(jù)庫的每個表的索引所占空間大小加起來看看以此服務(wù)器為例:比較大的幾個表索引加起來大概125M 這個數(shù)字會隨著表變大而變大。
從4.0.1開始,MySQL提供了查詢緩沖機(jī)制。使用查詢緩沖,MySQL將SELECT語句和查詢結(jié)果存放在緩沖區(qū)中,今后對于同樣的SELECT語句(區(qū)分大小寫),將直接從緩沖區(qū)中讀取結(jié)果。根據(jù)MySQL用戶手冊,使用查詢緩沖最多可以達(dá)到238%的效率。
通過調(diào)節(jié)以下幾個參數(shù)可以知道query_cache_size設(shè)置得是否合理
Qcache inserts
Qcache hits
Qcache lowmem prunes
Qcache free blocks
Qcache total blocks
Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況,同時Qcache_hits的值非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大小Qcache_hits的值不大,則表明你的查詢重復(fù)率很低,這種情況下使用查詢緩沖反而會影響效率,那么可以考慮不用查詢緩沖。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩沖。
Qcache_free_blocks,如果該值非常大,則表明緩沖區(qū)中碎片很多query_cache_type指定是否使用查詢緩沖
我設(shè)置:
query_cache_size = 32M
query_cache_type= 1
得到如下狀態(tài)值:
Qcache queries in cache 12737 表明目前緩存的條數(shù)
Qcache inserts 20649006
Qcache hits 79060095 看來重復(fù)查詢率還挺高的
Qcache lowmem prunes 617913 有這么多次出現(xiàn)緩存過低的情況
Qcache not cached 189896
Qcache free memory 18573912 目前剩余緩存空間
Qcache free blocks 5328 這個數(shù)字似乎有點大 碎片不少
Qcache total blocks 30953
如果內(nèi)存允許32M應(yīng)該要往上加點
table_cache指定表高速緩存的大小。每當(dāng)MySQL訪問一個表時,如果在表緩沖區(qū)中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內(nèi)容。通過檢查峰值時間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現(xiàn) open_tables等于table_cache,并且opened_tables在不斷增長,那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Open%tables’獲得)。注意,不能盲目地把table_cache設(shè)置成很大的值。如果設(shè)置得太高,可能會造成文件描述符不足,從而造成性能不穩(wěn)定或者連接失敗。
對于有1G內(nèi)存的機(jī)器,推薦值是128-256。
筆者設(shè)置
table_cache = 256
得到以下狀態(tài):
Open tables 256
Opened tables 9046
雖然open_tables已經(jīng)等于table_cache,但是相對于服務(wù)器運行時間來說,已經(jīng)運行了20天,opened_tables的值也非常低。因此,增加table_cache的值應(yīng)該用處不大。如果運行了6個小時就出現(xiàn)上述值 那就要考慮增大table_cache。
如果你不需要記錄2進(jìn)制log 就把這個功能關(guān)掉,注意關(guān)掉以后就不能恢復(fù)出問題前的數(shù)據(jù)了,需要您手動備份,二進(jìn)制日志包含所有更新數(shù)據(jù)的語句,其目的是在恢復(fù)數(shù)據(jù)庫時用它來把數(shù)據(jù)盡可能恢復(fù)到最后的狀態(tài)。另外,如果做同步復(fù)制( Replication )的話,也需要使用二進(jìn)制日志傳送修改情況。
log_bin指定日志文件,如果不提供文件名,MySQL將自己產(chǎn)生缺省文件名。MySQL會在文件名后面自動添加數(shù)字引,每次啟動服務(wù)時,都會重新生成一個新的二進(jìn)制文件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定記錄的數(shù)據(jù)庫;使用binlog- ignore-db可以指定不記錄的數(shù)據(jù)庫。注意的是:binlog-do-db和binlog-ignore-db一次只指定一個數(shù)據(jù)庫,指定多個數(shù)據(jù)庫需要多個語句。而且,MySQL會將所有的數(shù)據(jù)庫名稱改成小寫,在指定數(shù)據(jù)庫時必須全部使用小寫名字,否則不會起作用。
關(guān)掉這個功能只需要在他前面加上#號
#log-bin
開啟慢查詢?nèi)罩? slow query log )
慢查詢?nèi)罩緦τ诟櫽袉栴}的查詢非常有用。它記錄所有查過long_query_time的查詢,如果需要,還可以記錄不使用索引的記錄。下面是一個慢查詢?nèi)罩镜睦?#xff1a;
開啟慢查詢?nèi)罩?#xff0c;需要設(shè)置參數(shù)log_slow_queries、long_query_times、log-queries-not-using-indexes。
log_slow_queries指定日志文件,如果不提供文件名,MySQL將自己產(chǎn)生缺省文件名。long_query_times指定慢查詢的閾值,缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的參數(shù),它指示記錄不使用索引的查詢。筆者設(shè)置 long_query_time=10
筆者設(shè)置:
sort_buffer_size = 1M
max_connections=120
wait_timeout =120
back_log=100
read_buffer_size = 1M
thread_cache=32
interactive_timeout=120
thread_concurrency = 4
參數(shù)說明:
back_log
要求MySQL能有的連接數(shù)量。當(dāng)主要MySQL線程在一個很短時間內(nèi)得到非常多的連接請求,這就起作用,然后主線程花些時間(盡管很短)檢查連接并且啟動一個新線程。back_log值指出在MySQL暫時停止回答新請求之前的短時間內(nèi)多少個請求可以被存在堆棧中。只有如果期望在一個短時間內(nèi)有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP連接的偵聽隊列的大小。你的操作系統(tǒng)在這個隊列大小上有它自己的限制。 Unix listen(2)系統(tǒng)調(diào)用的手冊頁應(yīng)該有更多的細(xì)節(jié)。檢查你的OS文檔找出這個變量的最大值。試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無效的。
max_connections
并發(fā)連接數(shù)目最大,120 超過這個值就會自動恢復(fù),出了問題能自動解決
thread_cache
沒找到具體說明,不過設(shè)置為32后 20天才創(chuàng)建了400多個線程 而以前一天就創(chuàng)建了上千個線程 所以還是有用的
thread_concurrency
#設(shè)置為你的cpu數(shù)目x2,例如,只有一個cpu,那么thread_concurrency=2
#有2個cpu,那么thread_concurrency=4
skip-innodb
#去掉innodb支持
shell> mysqladmin variables
每個選項在下面描述。對于緩沖區(qū)大小、長度和棧大小的值以字節(jié)給出,你能用于個后綴“K”或“M” 指出以K字節(jié)或兆字節(jié)顯示值。例如,16M指出16兆字節(jié)。后綴字母的大小寫沒有關(guān)系;16M和16m是相同的。
你也可以用命令SHOW STATUS自一個運行的服務(wù)器看見一些統(tǒng)計。見7.21 SHOW語法(得到表、列的信息)。
back_log
要求MySQL能有的連接數(shù)量。當(dāng)主要MySQL線程在一個很短時間內(nèi)得到非常多的連接請求,這就起作用,然后主線程花些時間(盡管很短)檢查連接并且啟動一個新線程。back_log值指出在MySQL暫時停止回答新請求之前的短時間內(nèi)多少個請求可以被存在堆棧中。只有如果期望在一個短時間內(nèi)有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP連接的偵聽隊列的大小。你的操作系統(tǒng)在這個隊列大小上有它自己的限制。 Unix listen(2)系統(tǒng)調(diào)用的手冊頁應(yīng)該有更多的細(xì)節(jié)。檢查你的OS文檔找出這個變量的最大值。試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無效的。
connect_timeout
mysqld服務(wù)器在用Bad handshake(糟糕的握手)應(yīng)答前正在等待一個連接報文的秒數(shù)。
delayed_insert_timeout
一個INSERT DELAYED線程應(yīng)該在終止之前等待INSERT語句的時間。
delayed_insert_limit
在插入delayed_insert_limit行后,INSERT DELAYED處理器將檢查是否有任何SELECT語句未執(zhí)行。如果這樣,在繼續(xù)前執(zhí)行允許這些語句。
delayed_queue_size
應(yīng)該為處理INSERT DELAYED分配多大一個隊列(以行數(shù))。如果排隊滿了,任何進(jìn)行INSERT DELAYED的客戶將等待直到隊列又有空間了。
flush_time
如果這被設(shè)置為非零值,那么每flush_time秒所有表將被關(guān)閉(以釋放資源和sync到磁盤)。
interactive_timeout
服務(wù)器在關(guān)上它前在一個交互連接上等待行動的秒數(shù)。一個交互的客戶被定義為對mysql_real_connect()使用CLIENT_INTERACTIVE選項的客戶。也可見wait_timeout。
join_buffer_size
用于全部聯(lián)結(jié)(join)的緩沖區(qū)大小(不是用索引的聯(lián)結(jié))。緩沖區(qū)對2個表間的每個全部聯(lián)結(jié)分配一次緩沖區(qū),當(dāng)增加索引不可能時,增加該值可得到一個更快的全部聯(lián)結(jié)。(通常得到快速聯(lián)結(jié)的最佳方法是增加索引。)
key_buffer_size
索引塊是緩沖的并且被所有的線程共享。key_buffer_size是用于索引塊的緩沖區(qū)大小,增加它可得到更好處理的索引(對所有讀和多重寫),到你能負(fù)擔(dān)得起那樣多。如果你使它太大,系統(tǒng)將開始換頁并且真的變慢了。記住既然MySQL不緩存讀取的數(shù)據(jù),你將必須為OS文件系統(tǒng)緩存留下一些空間。為了在寫入多個行時得到更多的速度,使用LOCK TABLES。見7.24LOCK TABLES/UNLOCK TABLES語法。
long_query_time
如果一個查詢所用時間超過它(以秒計),Slow_queries記數(shù)器將被增加。
max_allowed_packet
一個包的最大尺寸。消息緩沖區(qū)被初始化為net_buffer_length字節(jié),但是可在需要時增加到max_allowed_packet個字節(jié)。缺省地,該值太小必能捕捉大的(可能錯誤)包。如果你正在使用大的BLOB列,你必須增加該值。它應(yīng)該象你想要使用的最大BLOB的那么大。
max_connections
允許的同時客戶的數(shù)量。增加該值增加mysqld要求的文件描述符的數(shù)量。見下面對文件描述符限制的注釋。見18.2.4 Too many connections錯誤。
max_connect_errors
如果有多于該數(shù)量的從一臺主機(jī)中斷的連接,這臺主機(jī)阻止進(jìn)一步的連接。你可用FLUSH HOSTS命令疏通一臺主機(jī)。
max_delayed_threads
不要啟動多于的這個數(shù)字的線程來處理INSERT DELAYED語句。如果你試圖在所有INSERT DELAYED線程在用后向一張新表插入數(shù)據(jù),行將被插入,就像DELAYED屬性沒被指定那樣。
max_join_size
可能將要讀入多于max_join_size個記錄的聯(lián)結(jié)將返回一個錯誤。如果你的用戶想要執(zhí)行沒有一個WHERE子句、花很長時間并且返回百萬行的聯(lián)結(jié),設(shè)置它。
max_sort_length
在排序BLOB或TEXT值時使用的字節(jié)數(shù)(每個值僅頭max_sort_length個字節(jié)被使用;其余的被忽略)。
max_tmp_tables
(該選擇目前還不做任何事情)。一個客戶能同時保持打開的臨時表的最大數(shù)量。
net_buffer_length
通信緩沖區(qū)在查詢之間被重置到該大小。通常這不應(yīng)該被改變,但是如果你有很少的內(nèi)存,你能將它設(shè)置為查詢期望的大小。(即,客戶發(fā)出的SQL語句期望的長度。如果語句超過這個長度,緩沖區(qū)自動地被擴(kuò)大,直到max_allowed_packet個字節(jié)。)
record_buffer
每個進(jìn)行一個順序掃描的線程為其掃描的每張表分配這個大小的一個緩沖區(qū)。如果你做很多順序掃描,你可能想要增加該值。
sort_buffer
每個需要進(jìn)行排序的線程分配該大小的一個緩沖區(qū)。增加這值加速ORDER BY或GROUP BY操作。見18.5 MySQL在哪兒存儲臨時文件。
table_cache
為所有線程打開表的數(shù)量。增加該值能增加mysqld要求的文件描述符的數(shù)量。MySQL對每個唯一打開的表需要2個文件描述符,見下面對文件描述符限制的注釋。對于表緩存如何工作的信息,見10.2.4 MySQL怎樣打開和關(guān)閉表。
tmp_table_size
如果一張臨時表超出該大小,MySQL產(chǎn)生一個The table tbl_name is full形式的錯誤,如果你做很多高級GROUP BY查詢,增加tmp_table_size值。
thread_stack
每個線程的棧大小。由crash-me測試檢測到的許多限制依賴于該值。缺省隊一般的操作是足夠大了。見10.8 使用你自己的基準(zhǔn)。
wait_timeout
服務(wù)器在關(guān)閉它之前在一個連接上等待行動的秒數(shù)。也可見interactive_timeout。
MySQL的Query Cache
QueryCache(下面簡稱QC)是根據(jù)SQL語句來cache的。一個SQL查詢?nèi)绻詓elect開頭,那么MySQL服務(wù)器將嘗試對其使用 QC。每個Cache都是以SQL文本作為key來存的。在應(yīng)用QC之前,SQL文本不會被作任何處理。也就是說,兩個SQL語句,只要相差哪怕是一個字符(例如大小寫不一樣;多一個空格等),那么這兩個SQL將使用不同的一個CACHE。不過SQL文本有可能會被客戶端做一些處理。例如在官方的命令行客戶端里,在發(fā)送SQL給服務(wù)器之前,會做如下處理:
過濾所有注釋
去掉SQL文本前后的空格,TAB等字符。注意,是文本前面和后面的。中間的不會被去掉。
轉(zhuǎn)載于:https://my.oschina.net/birdlovecloud/blog/198632
總結(jié)
以上是生活随笔為你收集整理的Linux高负载下优化MYSQL(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TFS配置(二)
- 下一篇: mysql隐式转换造成索引失效的事故总结