国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

MySQL性能相關(guān)參數有哪些

發(fā)布時(shí)間:2021-09-14 18:07 來(lái)源:億速云 閱讀:0 作者:柒染 欄目: Mysql 歡迎投稿:712375056

這篇文章給大家介紹性能相關(guān)參數有哪些,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

整理MySQL常用性能相關(guān)參數如下

general_log

記錄所有執行的語(yǔ)句,在需要分析問(wèn)題打開(kāi)即可,正常服務(wù)時(shí)不需要開(kāi)啟,以免帶來(lái)io性能影響

query_cache_size

緩存sql文本和查詢(xún)結果的,如果對應的表沒(méi)有變化,下次碰到一樣的SQL,跳過(guò)解析和查詢(xún),直接返回結果。

但是表變化非常頻繁,SQL也是動(dòng)態(tài)生產(chǎn)的,由于需要不斷更新cache內容,這時(shí)鎖力度很大,反而照成瓶頸。這時(shí)最好關(guān)掉這個(gè)功能,設置參數為0

sort_buffer_size

針對單個(gè)session的參數,

排序時(shí),如果用不到index,session就會(huì )申請一塊這么大的內存空間進(jìn)行排序。如果這個(gè)參數值過(guò)小會(huì )把排序結果寫(xiě)入硬盤(pán)中,會(huì )影響效率。

如果太大,又可能導致物理內存耗盡,導致OOM。

join_buffer_size

在join無(wú)法使用到index時(shí)候用到的buffer,和sort_buffer_size類(lèi)似

tmp_table_size

在group by和distinct時(shí)如果SQL用不到索引,就會(huì )使用系統內部臨時(shí)表記錄中間狀態(tài)。如果該值不夠大,就使用物理硬盤(pán)

Innodb_buffer_pool_size

InnoDB最重要的緩存,用來(lái)緩存innodb索引頁(yè)面、undo頁(yè)面及其他輔助數據。一般設定物理內存50%~75%

Innodb_buffer_pool_instances

通過(guò)這個(gè)參數可以把整塊buffer pool分割為多塊instance內存空間,每個(gè)空間獨立管理自己的內存和鏈表,來(lái)提升MySQL請求處理的并發(fā)能力。

因為buffer pool是通過(guò)鏈表來(lái)管理的,同時(shí)為了保護頁(yè)面,需要在存取的時(shí)候對鏈表加鎖,在多線(xiàn)程情況下,并發(fā)讀寫(xiě)buffer pool緩存會(huì )有鎖競爭和等待。

官方說(shuō)超過(guò)1G的Innodb_buffer_pool_size 考慮設定instances去切分內存

Innodb_log_file_size,innodb_log_files_in_group

兩個(gè)參數決定redo空間的大小,設置存儲更新redo越大,有效降低buffer pool臟頁(yè)被淘汰的速度,減少了checkpoint此書(shū),降低磁盤(pán)I/O

不過(guò)設置過(guò)大,在數據庫異常宕機時(shí),恢復時(shí)間越長(cháng)

Innodb_old_blocks_pct,innodb_old_blocks_time

innodb_old_blocks_pct:

全局、動(dòng)態(tài)變量,默認值 37,取值范圍為5~95. 用來(lái)確定LRU鏈表中old sublist所占比例

innodb_old_blocks_time:

全局、動(dòng)態(tài)變量,默認值 1000,取值范圍為0~2**32-1,單位ms。

用來(lái)控制old sublist中page的轉移策略,新的page頁(yè)在進(jìn)入LRU鏈表中時(shí),會(huì )先插入到old sublist的頭部,然后page需要在old sublist中停留innodb_old_blocks_time這么久后,下一次對該page的訪(fǎng)問(wèn)才會(huì )使其移動(dòng)到new sublist的頭部,

該參數的設置可以保護new sublist,盡可能的防止其being filled by page that is referenced only for a brief period。

 

默認的緩沖中的頁(yè)在第一次被讀取時(shí)(也就是命中緩存)會(huì )被移動(dòng)到新頁(yè)子表頭部,意味著(zhù)其會(huì )長(cháng)期待在緩沖池中不會(huì )被淘汰。這樣就會(huì )存在一個(gè)問(wèn)題,一次表掃描(比如使用select查詢(xún))可能會(huì )將大量數據放入緩存中,并淘汰相應數量的舊數據,但是可能這些數據只使用一次,后面不再使用;同樣地,因為read-ahead也會(huì )在下一次訪(fǎng)問(wèn)該頁(yè)時(shí)被放入新頁(yè)子表頭部。這些情形會(huì )將本應會(huì )被頻繁使用的頁(yè)移動(dòng)到舊頁(yè)子表中。

所以3/8位置處。在后面的第一次命中(被訪(fǎng)問(wèn)時(shí))的頁(yè)會(huì )被移動(dòng)到列表的頭部。因此,那些讀入緩存但是后面從來(lái)不會(huì )被訪(fǎng)問(wèn)的頁(yè)也從不會(huì )被放入列表的頭部,也就會(huì )在后面被從緩沖池淘汰。

MySQL提供了配置參數,milliseconds)讀取不會(huì )被標識為年輕,也就是不會(huì )被移動(dòng)到列表頭部。參數1000,增大這個(gè)參數將會(huì )造成更多的頁(yè)會(huì )更快的從緩沖池中被淘汰。

Innodb_flush_method

Innodb刷數據和日志到磁盤(pán)的方式,這個(gè)值默認為空,其實(shí):

Linux默認fsync

Windows 默認async_unbuffered

SSD和PCIE存儲時(shí)可以使用o_direct 提升性能

Innodb_doublewrite

MySQL默認每個(gè)page size是16k,而OS通常最小I/O單元是4k,所以如果寫(xiě)page時(shí)可能需要調用4次OS I/O才能完成。假定在執行兩次時(shí)DB crash了,這時(shí)page只寫(xiě)了一部分,就產(chǎn)生了partial write(不完整寫(xiě))。

MySQL double write的設定就是為了在發(fā)生partial write時(shí)任然保證已經(jīng)commit的數據不丟失,以及數據文件不損壞。

但如果底層存儲支持原子性可以關(guān)閉兩次寫(xiě),主要看OS page size和DB page size的關(guān)系。

Innodb_io_capacity

控制后臺不斷將內存(dirty data)數據flush硬盤(pán)的操作,遇到周期性IO QPS下降時(shí)可以考慮提高參數的設定,以加速flush的頻率

參考實(shí)驗提高Innodb_io_capacity的設置,已提升QPS

Innodb_thread_concurrency

在并發(fā)量大的時(shí),增加這個(gè)值,兒科降低innodb在并發(fā)線(xiàn)程之間切換開(kāi)銷(xiāo),以增加系統的并發(fā)吞吐量

innodb_flush_log_at_trx_commit

控制redo log刷盤(pán)機制

innodb_flush_log_at_trx_commit=0

事務(wù)提交時(shí),不會(huì )處理log buffer的內容,也不會(huì )處理log file在OS cache的刷盤(pán)操作,由MySQL后臺master線(xiàn)程每隔1秒將log buffer刷新到磁盤(pán)的log file中。

在MySQL服務(wù)宕掉,正?;蝈礄C時(shí):

由于事務(wù)提交不刷新logbuffer,即使事務(wù)提交了,logbuffer也會(huì )全部丟失,但只丟失最近1秒的事務(wù)

innodb_flush_log_at_trx_commit=1

事務(wù)提交時(shí),會(huì )將log buffer的內容寫(xiě)入OS cache文件中,同時(shí)會(huì )將OS cache刷新到磁盤(pán)log file中。

在MySQL服務(wù)宕掉,服務(wù)器正?;蝈礄C時(shí):

由于事務(wù)提交會(huì )刷新到磁盤(pán)log file中,所以數據都不會(huì )丟失

innodb_flush_log_at_trx_commit=2

事務(wù)提交時(shí),會(huì )將log buffer的內容寫(xiě)到OS cache文件中,由MySQL后臺master線(xiàn)程每隔1秒將OS cache的log file刷新到磁盤(pán)。

在MySQL服務(wù)宕掉,服務(wù)器正常:

由于事務(wù)已經(jīng)刷新到OS cache中,然而服務(wù)器沒(méi)宕機,這樣日志還是會(huì )被刷新到磁盤(pán)中,那么數據就不會(huì )丟失

在MySQL服務(wù)宕掉,服務(wù)器宕機:

由于事務(wù)只刷新到OS cache中,服務(wù)器宕機話(huà),日志沒(méi)用被刷新到磁盤(pán)中,會(huì )丟失1秒的事務(wù)

sync_binlog

控制binlog同步到磁盤(pán)的方式

sync_binlog=0,事務(wù)提交時(shí)將MySQL Binlog信息寫(xiě)入OS cache Binlog中,由OS自己空間其緩存的刷新。如果是服務(wù)器宕機binlog cache中所有binlog都會(huì )丟失

sync_binlog=1,每個(gè)事務(wù)提交時(shí),MySQL都會(huì )把Binlog刷新到物理磁盤(pán)中。這樣安全最高,性能損耗是最大。特別是在多事務(wù)同行提交,會(huì )對I/O性能帶來(lái)很大影響。

group commit可以緩解壓力

binlog_group_commit_sync_delay=N,默認是0,定時(shí)執行,在commit后等待N 微秒后,進(jìn)行binlog刷盤(pán)操作

binlog_group_commit_sync_no_delay_count=N,在commit后等待達到最大事務(wù)等待數量N, 就忽視binlog_group_commit_sync_delay的設置,直接開(kāi)始刷盤(pán),注意如果binlog_group_commit_sync_delay設置為0,則此選項無(wú)效

不過(guò)group commit的設置,可能會(huì )影響commit執行執行速度,可參考: https://www.cnblogs.com/ziroro/p/9600359.html

sync_binlog=N, 表示每N次事務(wù)提交,MySQL會(huì )做刷盤(pán)。如果DB服務(wù)或者服務(wù)器宕機會(huì )丟失一些事務(wù)

注:開(kāi)啟Binlog后,MySQL內部會(huì )自動(dòng)將事務(wù)當作一個(gè)XA事務(wù)處理,在提交事務(wù)過(guò)程中,會(huì )自動(dòng)分配一個(gè)唯一的XID,XID會(huì )記錄到Binlog和redo log中。事務(wù)在提交過(guò)程會(huì )自動(dòng)份為Prepare和Commit兩個(gè)階段。

Prepare階段:告訴InnoDB做prepare,InnoDB更改事務(wù)狀態(tài),并將redo log刷入磁盤(pán)

Commit階段:先記錄Binlog,然后告訴InnoDB commit

binlog_format

binlog_format=STATEMENT

寫(xiě)入執行的SQL語(yǔ)句到binlog,從庫讀取這些SQL并執行

優(yōu)勢:

技術(shù)成熟

減少binlog的寫(xiě)入量

binlog包含所有修改語(yǔ)句沒(méi)便于審計

缺點(diǎn):

有些函數不能再slave上復雜,如sleep(),last_insert_id(),udf等會(huì )除問(wèn)題

與基于row的復制比,insert...select需要更多的鎖

隔離級別必須是repeatable-read,而這是發(fā)生死鎖的元兇之一

binlog_format=MIXED

默認使用STATEMENT記錄日志,特定情況下轉換成ROW記錄

binlog_format=ROW

MySQL5.7.7之后的默認值

優(yōu)點(diǎn):

復制是最安全的

slave需要的鎖也最少

缺點(diǎn):

binlog會(huì )記錄更多的數據

無(wú)法在slave上看到master上獲取的語(yǔ)句,因為都是event。但可以開(kāi)啟binlog_rows_query_log_events參數,讓binlog記錄events同時(shí)也記錄原始SQL語(yǔ)句。

(復制建議使用row模式,其它模式有可能出現主從數據不一致)

tx_isolation

MySQL隔離級別,默認是repeatable-read

Read Uncommitted

Read Committed

Repeatable Read

Serializable

這四種級別越來(lái)越嚴格,但性能越來(lái)越差。

推薦使用Read Committed,同時(shí)binlog_format=ROW ,確認binlog同步數據主從庫一致性,兼顧安全,滿(mǎn)足絕大多數業(yè)務(wù)。

slave_parallel_workers

MySQL 5.6中,設置參數slave_parallel_workers = 4,即可有4個(gè)SQL Thread(coordinator線(xiàn)程)來(lái)進(jìn)行并行復制,其狀態(tài)為:Waiting for an evant from Coordinator。但是其并行只是基于database的。如果數據庫實(shí)例中存在多個(gè)database,這樣設置對于Slave復制的速度可以有比較大的提升。

其核心思想是:不同database下的表并發(fā)提交時(shí)的數據不會(huì )相互影響,即slave節點(diǎn)可以用對relay log中不同的schema各分配一個(gè)類(lèi)似SQL功能的線(xiàn)程,來(lái)重放relay log中主庫已經(jīng)提交的事務(wù),保持數據與主庫一致。

在MySQL 5.7中,引入了基于組提交的并行復制(Enhanced Multi-threaded Slaves),

設置slave_parallel_workers>0并且global.slave_parallel_type=‘LOGICAL_CLOCK’,即可支持一個(gè)database下,slave_parallel_workers個(gè)的worker線(xiàn)程并發(fā)執行relay log中主庫提交的事務(wù)。

其核心思想:一個(gè)組提交的事務(wù)都是可以并行回放(配合binary log group commit);

slave機器的relay log中 last_committed相同的事務(wù)(sequence_num不同)可以并發(fā)執行。

參數slave_parallel_type可以有兩個(gè)值:

DATABASE 默認值,基于庫的并行復制方式

LOGICAL_CLOCK:基于組提交的并行復制方式

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

国产精品一区波多野结衣| 成 人 色综合| 成人网站免费观看| 大尺度无遮挡激烈床震网站| 午夜成人性爽爽免费视频| 一个人看的WWW片免费高清中文|