中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL性能相關參數有哪些

發布時間:2021-09-13 17:00:01 來源:億速云 閱讀:203 作者:柒染 欄目:MySQL數據庫

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

整理MySQL常用性能相關參數如下

general_log

記錄所有執行的語句,在需要分析問題打開即可,正常服務時不需要開啟,以免帶來io性能影響

query_cache_size

緩存sql文本和查詢結果的,如果對應的表沒有變化,下次碰到一樣的SQL,跳過解析和查詢,直接返回結果。

但是表變化非常頻繁,SQL也是動態生產的,由于需要不斷更新cache內容,這時鎖力度很大,反而照成瓶頸。這時最好關掉這個功能,設置參數為0

sort_buffer_size

針對單個session的參數,

排序時,如果用不到index,session就會申請一塊這么大的內存空間進行排序。如果這個參數值過小會把排序結果寫入硬盤中,會影響效率。

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

join_buffer_size

在join無法使用到index時候用到的buffer,和sort_buffer_size類似

tmp_table_size

在group by和distinct時如果SQL用不到索引,就會使用系統內部臨時表記錄中間狀態。如果該值不夠大,就使用物理硬盤

Innodb_buffer_pool_size

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

Innodb_buffer_pool_instances

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

因為buffer pool是通過鏈表來管理的,同時為了保護頁面,需要在存取的時候對鏈表加鎖,在多線程情況下,并發讀寫buffer pool緩存會有鎖競爭和等待。

官方說超過1G的Innodb_buffer_pool_size 考慮設定instances去切分內存

Innodb_log_file_size,innodb_log_files_in_group

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

不過設置過大,在數據庫異常宕機時,恢復時間越長

Innodb_old_blocks_pct,innodb_old_blocks_time

innodb_old_blocks_pct:

全局、動態變量,默認值 37,取值范圍為5~95. 用來確定LRU鏈表中old sublist所占比例

innodb_old_blocks_time:

全局、動態變量,默認值 1000,取值范圍為0~2**32-1,單位ms。

用來控制old sublist中page的轉移策略,新的page頁在進入LRU鏈表中時,會先插入到old sublist的頭部,然后page需要在old sublist中停留innodb_old_blocks_time這么久后,下一次對該page的訪問才會使其移動到new sublist的頭部,

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

 MySQL性能相關參數有哪些

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

所以3/8位置處。在后面的第一次命中(被訪問時)的頁會被移動到列表的頭部。因此,那些讀入緩存但是后面從來不會被訪問的頁也從不會被放入列表的頭部,也就會在后面被從緩沖池淘汰。

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

Innodb_flush_method

Innodb刷數據和日志到磁盤的方式,這個值默認為空,其實:

Linux默認fsync

Windows 默認async_unbuffered

SSD和PCIE存儲時可以使用o_direct 提升性能

Innodb_doublewrite

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

MySQL double write的設定就是為了在發生partial write時任然保證已經commit的數據不丟失,以及數據文件不損壞。

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

Innodb_io_capacity

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

參考實驗提高Innodb_io_capacity的設置,已提升QPS

Innodb_thread_concurrency

在并發量大的時,增加這個值,兒科降低innodb在并發線程之間切換開銷,以增加系統的并發吞吐量

innodb_flush_log_at_trx_commit

控制redo log刷盤機制

innodb_flush_log_at_trx_commit=0

事務提交時,不會處理log buffer的內容,也不會處理log file在OS cache的刷盤操作,由MySQL后臺master線程每隔1秒將log buffer刷新到磁盤的log file中。

在MySQL服務宕掉,服務器正常或宕機時:

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

innodb_flush_log_at_trx_commit=1

事務提交時,會將log buffer的內容寫入OS cache文件中,同時會將OS cache刷新到磁盤log file中。

在MySQL服務宕掉,服務器正常或宕機時:

由于事務提交會刷新到磁盤log file中,所以數據都不會丟失

innodb_flush_log_at_trx_commit=2

事務提交時,會將log buffer的內容寫到OS cache文件中,由MySQL后臺master線程每隔1秒將OS cache的log file刷新到磁盤。

在MySQL服務宕掉,服務器正常:

由于事務已經刷新到OS cache中,然而服務器沒宕機,這樣日志還是會被刷新到磁盤中,那么數據就不會丟失

在MySQL服務宕掉,服務器宕機:

由于事務只刷新到OS cache中,服務器宕機話,日志沒用被刷新到磁盤中,會丟失1秒的事務

sync_binlog

控制binlog同步到磁盤的方式

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

sync_binlog=1,每個事務提交時,MySQL都會把Binlog刷新到物理磁盤中。這樣安全性最高,性能損耗是最大。特別是在多事務同行提交,會對I/O性能帶來很大影響。

group commit可以緩解壓力

binlog_group_commit_sync_delay=N,默認是0,定時執行,在commit后等待N 微秒后,進行binlog刷盤操作

binlog_group_commit_sync_no_delay_count=N,在commit后等待達到最大事務等待數量N, 就忽視binlog_group_commit_sync_delay的設置,直接開始刷盤,注意如果binlog_group_commit_sync_delay設置為0,則此選項無效

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

sync_binlog=N, 表示每N次事務提交,MySQL會做刷盤。如果DB服務或者服務器宕機會丟失一些事務

注:開啟Binlog后,MySQL內部會自動將事務當作一個XA事務處理,在提交事務過程中,會自動分配一個唯一的XID,XID會記錄到Binlog和redo log中。事務在提交過程會自動份為Prepare和Commit兩個階段。

Prepare階段:告訴InnoDB做prepare,InnoDB更改事務狀態,并將redo log刷入磁盤

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

binlog_format

binlog_format=STATEMENT

寫入執行的SQL語句到binlog,從庫讀取這些SQL并執行

優勢:

技術成熟

減少binlog的寫入量

binlog包含所有修改語句沒便于審計

缺點:

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

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

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

binlog_format=MIXED

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

binlog_format=ROW

MySQL5.7.7之后的默認值

優點:

復制是最安全的

slave需要的鎖也最少

缺點:

binlog會記錄更多的數據

無法在slave上看到master上獲取的語句,因為都是event。但可以開啟binlog_rows_query_log_events參數,讓binlog記錄events同時也記錄原始SQL語句。

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

tx_isolation

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

Read Uncommitted

Read Committed

Repeatable Read

Serializable

這四種級別越來越嚴格,但性能越來越差。

推薦使用Read Committed,同時binlog_format=ROW ,確認binlog同步數據主從庫一致性,兼顧安全,滿足絕大多數業務。

slave_parallel_workers

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

其核心思想是:不同database下的表并發提交時的數據不會相互影響,即slave節點可以用對relay log中不同的schema各分配一個類似SQL功能的線程,來重放relay log中主庫已經提交的事務,保持數據與主庫一致。

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

設置slave_parallel_workers>0并且global.slave_parallel_type=‘LOGICAL_CLOCK’,即可支持一個database下,slave_parallel_workers個的worker線程并發執行relay log中主庫提交的事務。

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

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

參數slave_parallel_type可以有兩個值:

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

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

關于MySQL性能相關參數有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

读书| 和平县| 馆陶县| 山东| 望都县| 永安市| 新田县| 河南省| 饶平县| 苏州市| 平泉县| 邛崃市| 德惠市| 鞍山市| 深泽县| 铜梁县| 镇赉县| 三江| 太和县| 银川市| 滨海县| 类乌齐县| 乐清市| 于田县| 大同市| 东乡县| 灌阳县| 林周县| 武山县| 宣恩县| 莫力| 鄂温| 云梦县| 卢湾区| 阿拉善左旗| 鄂州市| 胶州市| 五常市| 噶尔县| 新兴县| 昔阳县|