分區會增加 mariadb 中的 CPU 使用率
我正在使用mariadb 10.2,我有一個結構類似於下面的表,目前為15gb,我一直每分鐘插入幾千條記錄,每批用於特定帳戶(AccountId1)。
AccountId1 bigint PK, AccountId2 bigint PK, ActionType int, ActionDate timestamp
查看程序列表,多個插入在排隊等待這張表,而且它們總是一次執行一個插入,所以我決定通過 AccountId1 上的雜湊對這張表進行分區,並創建了 32 個分區。
在高峰時段,插入現在從每秒 1 或 2 個躍升至 8 個,效果很好。問題是更改後CPU使用率從15%躍升至40%,即使完全停止插入過程幾個小時,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, 2015
:MySQL Create Table with Partition Slow on server machine每個分區都被視為具有不同表空間的單獨 InnoDB 表。
存在什麼成本?
- 資訊模式的記憶體使用(添加新表 - 記憶體使用增加)
- 按分區分隔的索引統計資訊(我需要索引分區所依據的鍵嗎?)
- 打開文件句柄(在您的情況下,33 [每個
.ibd
文件 1 個文件句柄,1 個用於.frm
])雖然這些東西有助於解釋成本,但您一定仍然想知道 CPU 活動來自哪裡???
中央處理器
基於打開的文件句柄,仍然會有一些 CPU 活動。如何 ?
選項 innodb_open_files 通過 MySQL 實例對所有 InnoDB 表打開文件句柄的數量進行限制。
如果需要監控軟體檢查表資訊,更多的查詢會佔用更多的 CPU。
如果有任何查詢不訪問磁碟(例如
SHOW PROCESSLIST;
orSHOW GLOBAL STATUS;
)或從 INFORMATION_SCHEMA 讀取,則需要更多 CPU。(參見我在 24 天內 10 億個 mysql 查詢的舊 ServerFault 文章2011-08-10
?會不會有什麼問題?)打開和關閉文件句柄以訪問某些表並將 16K 頁面讀入 InnoDB 緩衝區或將 InnoDB 緩衝池中的頁面標記為舊的。