MySQL8中文手冊 調優InnoDB的I O能力

2021-10-20 18:53:26 字數 2389 閱讀 8631

寫在前面

innodb的主線程和其他執行緒執行了多種後台任務,其中大多數任務都是i/o操作相關的,比如從buffer pool中刷髒資料頁,把change buffer中的變更內容儲存到對應的二級索引。innodb引擎在執行這些後台任務的時候,盡量不影響其他任務的正常執行。引擎會預估作業系統可用的i/o操作能力,並根據能力對後台任務的執行頻率進行調整,以發揮引擎的最大的效能。

innodb_io_capacity引數定義了innodb的總體i/o操作能力,這個引數一般設定為作業系統每秒可以操作i/o的次數(iops)。引數設定後,innodb會根據該引數估算後台執行緒執行任務使用的i/o操作頻寬。

你可以設定innodb_io_capacity引數為100以上的值,預設是200。一般情況下,100左右的值對於普通的儲存裝置來說是夠用的,比如7200rpm的機械磁碟。對於更快的磁碟,比如raid或ssd等,可以設定為更高的值。

理想情況下,這個值設定的越低越好,但如果設定的過低會導致後台執行的任務嚴重落後於其他任務。如果這個值設定的太高,buffer pool和change buffer中的資料頁會被快速的刷入磁碟,從而使快取不能發揮太大的作用。對於有更高i/o速率的系統,可以設定乙個更大的值,讓系統能快速處理由資料變更引起的大量後台操作任務。通常,你可以根據innodb使用的i/o驅動器的數量來增加這個引數值,如果你的系統使用了多塊磁碟或使用了ssd,這個值可以設定的大一些。

對於低端的ssd儲存,使用預設值200一般可以滿足,但對於高階的ssd可以考慮設定的高一些,比如1000。對於只裝單塊5400rpm或7200rpm機械磁碟的系統,可能需要把這個值調低到100左右,因為老一代的機械磁碟的iops一般只有100左右。

雖然你可以設定乙個非常大的值,比如1百萬,在實際中這麼大的值沒有太大的用處。一般最大不要超過20000,除非你確信設定為20000以下不能發揮你的系統的優勢。

在調優innodb_io_capacity引數的時候要考慮寫操作的負載。如果系統中存在大量的寫操作,把這個引數設定高一點,如果系統中只有少量寫操作,設定低一點就足夠了。

對於多例項來說,innodb_io_capacity引數並不是針對每個buffer pool例項的。對於刷盤操作,i/o能力是在多個buffer pool例項之間均勻分配的。

你可以使用mysql的配置檔案(my.cnf或my.ini)來永久設定innodb_io_capacity引數,頁可以使用set_global來臨時設定,詳見:section 5.1.9.1, 「system variable privileges」.

在checkpoints時忽略i/o 能力設定

當系統達到checkpoints時,存在大量資料頁需要刷盤,預設開啟的innodb_flush_sync引數,可能會導致innodb_io_capacity引數失效。如果需要嚴格按照innodb_io_capacity配置的i/o速率,需要禁用innodb_flush_sync引數。

你可以在mysql的配置檔案(my.cnf或my.ini)中永久配置innodb_flush_sync引數,也可以使用set global命令臨時修改,詳見:section 5.1.9.1, 「system variable privileges」.

最大限度的配置i/o能力

如果刷盤操作落後於表操作,innodb可以更加激進的進行刷盤,會比innodb_io_capacity定義的iops能力更頻繁。在這種情況下,innodb_io_capacity_max引數可以定義innodb後台程序刷盤的最大iops。

如果在系統啟動時指定了innodb_io_capacity的引數,但沒有指定innodb_io_capacity_max的值,innodb_io_capacity_max的值預設為innodb_io_capacity值的兩倍,最大不超過2000。

在配置innodb_io_capacity_max引數時,開始時一般都把它設定為innodb_io_capacity的兩倍。預設值2000適用於比普通磁碟效能高的ssd盤。在沒有使用ssd或多盤的系統中,如果將引數設定為2000會有些偏高,這樣會導致頻繁的進行刷盤操作。對於單盤來說,設定為200到400之間會比較合適。對於高階的ssd可以考慮設定為2500。與設定innodb_io_capacity一樣,這個值盡量設定低些,但不能低到innodb無法將速率提公升到innodb_io_capacity設定的iops之上。

在調優innodb_io_capacity_max引數的時候,需要考慮系統的寫負載。系統中寫操作較多,需要設定大些的值才能發揮系統優勢,如果系統中寫操作較少,設定乙個較小的值就足以滿足系統要求。

innodb_io_capacity_max引數不能設定的比innodb_io_capacity引數小,使用set global innodb_io_capacity_max=default命令來設定innodb_io_capacity_max為最大值。innodb_io_capacity_max引數會限制所有buffer pool例項,並不是每個buffer pool例項有乙個配置。

mysql8問題 mysql8中的問題

only full group by 對於group by聚合操作,如果在 select 中的列,沒有在 group by 現,那麼這個sql是不合法的,因為列不在group by從句中。no auto value on zero 該值影響自增長列的插入。預設設定下,插入0或null代表生成下乙個自...

mysql8使用load data將資料檔案入庫

最近在linux系統上,需要將乙個資料檔案入庫,資料檔案以 分隔,n換行,這裡記錄一下遇到的問題及解決辦法。首先宣告一下我的資料庫名叫yunwqdb,密碼123456,表名test,資料檔案放在 home file 下,檔名20201023,資料庫root使用者密碼654321。使用root使用者登...

mysql 子分割槽 mysql8 參考手冊 子分割槽

子分割槽 也稱為 復合分割槽 是分割槽表中每個分割槽的進一步劃分。考慮以下 create table語句 create table ts id int,purchased date partition by range year purchased subpartition by hash to d...