Mysql

分區會增加 mariadb 中的 CPU 使用率

  • March 13, 2018

我正在使用mariadb 10.2,我有一個結構類似於下面的表,目前為15gb,我一直每分鐘插入幾千條記錄,每批用於特定帳戶(AccountId1)。

AccountId1 bigint PK,
AccountId2 bigint PK,
ActionType int,
ActionDate timestamp

查看程序列表,多個插入在排隊等待這張表,而且它們總是一次執行一個插入,所以我決定通過 AccountId1 上的雜湊對這張表進行分區,並創建了 32 個分區。

在高峰時段,插入現在從每秒 1 或 2 個躍升至 8 個,效果很好。問題是更改後CPU使用率從15%躍升至40%,即使完全停止插入過程幾個小時,CPU也不會下降。

分區前後的cpu使用率

我們從該表中選擇的幾個地方可以跨越所有分區,但這些程序每隔幾個小時執行一次,不會花費那麼長時間。其他頻繁查詢總是使用該AccountId1欄位,並且通過查看查詢計劃來查詢單個分區。

是否有任何與分區相關的成本,即使沒有 sql 觸及該表?CPU 增加的原因可能是什麼?

注意:任何時候都有大約 2000 個並發連接,但分區前後的連接數相同。

高架

需要了解的是分區表的物理實現。

例如,在我的舊文章(Aug 31, 2014子分區實際上如何工作以及創建了哪些物理文件?)中,我展示了分區表的樣子:

C:\>cd \MySQL_5.6.15\data\test

C:\MySQL_5.6.15\data\test>dir nums_comp*
Volume in drive C is TI10665200H
Volume Serial Number is A273-2EFF

Directory of C:\MySQL_5.6.15\data\test

08/31/2014  04:09 PM            98,304 nums_composite#p#p0#sp#p0sp0.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p0#sp#p0sp1.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p1#sp#p1sp0.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p1#sp#p1sp1.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p2#sp#p2sp0.ibd
08/31/2014  04:09 PM            98,304 nums_composite#p#p2#sp#p2sp1.ibd
08/31/2014  04:09 PM             8,594 nums_composite.frm
08/31/2014  04:09 PM                96 nums_composite.par
              8 File(s)        598,514 bytes
              0 Dir(s)  686,691,409,920 bytes free

C:\MySQL_5.6.15\data\test>

我有另一個例子Feb 16, 2015MySQL Create Table with Partition Slow on server machine

每個分區都被視為具有不同表空間的單獨 InnoDB 表。

存在什麼成本?

雖然這些東西有助於解釋成本,但您一定仍然想知道 CPU 活動來自哪裡???

中央處理器

基於打開的文件句柄,仍然會有一些 CPU 活動。如何 ?

選項 innodb_open_files 通過 MySQL 實例對所有 InnoDB 表打開文件句柄的數量進行限制。

如果需要監控軟體檢查表資訊,更多的查詢會佔用更多的 CPU。

如果有任何查詢不訪問磁碟(例如SHOW PROCESSLIST;or SHOW GLOBAL STATUS;)或從 INFORMATION_SCHEMA 讀取,則需要更多 CPU。(參見我在 24 天內 10 億個 mysql 查詢的舊 ServerFault 文章2011-08-10 ?會不會有什麼問題?

打開和關閉文件句柄以訪問某些表並將 16K 頁面讀入 InnoDB 緩衝區或將 InnoDB 緩衝池中的頁面標記為舊的。

引用自:https://dba.stackexchange.com/questions/200129