上篇文章提到,我切 partition 的條件用的是日期,而且是每日一個 partition,依照這樣算,一年會有365個 partition ,假設10年就有 3650 個。那麼會不會超過上限? 還是會不會超過某個數量後查詢的效能就大幅降低?這是本篇文章想測試的。
測試之前先說明一下,在 MySQL 5.6 之後一張表最多可以切 8192 個 partition,也就是說就算每天切一個,切20年都不是問題,所以想來測測看效能如何。
實驗說明:
分別建立 partition 數量為 2 , 512, 1024, 8000 的表,每張表裡面都放一樣數量的資料
★ 測試資料
CREATE TABLE `dictionary_2` (
`trans_id` int NOT NULL AUTO_INCREMENT,
`lang_id` int NOT NULL,
`lang` char(5) NOT NULL,
`trans_text` text,
PRIMARY KEY (`trans_id`,`lang_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY LIST (`lang_id`)
(
PARTITION lang_1 VALUES IN (1) ENGINE = InnoDB,
PARTITION lang_2 VALUES IN (2) ENGINE = InnoDB
);
塞完資料後四張表各 partition 的佔用資料數如下圖1~4
圖1
圖2
圖3
圖4
★ 開始測試這4張TABLE 有什麼差異
測試 1: 有用到正確的欄位,所以會使用到對的 partition
select * from dictionary_2 where lang_id = 2;
select * from dictionary_512 where lang_id = 2;
select * from dictionary_1024 where lang_id = 2;
select * from dictionary_8000 where lang_id = 2;
測試 2: 沒有用到正確的欄位,所以會全表 scan
select * from dictionary_2 where lang = 'zh-tw';
select * from dictionary_512 where lang = 'zh-tw';
select * from dictionary_1024 where lang = 'zh-tw';
select * from dictionary_8000 where lang = 'zh-tw';
資料庫知識相當廣泛,文中若有不正確的地方,也煩請各位大神不吝指教,謝謝
MySQL Partition and InnoDB
https://medium.com/corneltek/mysql-partition-and-innodb-c2b5982e3c04
意想不到的MySQL复制延迟原因
https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=2653930276&idx=1&sn=40d37e6b9e7b4cf53b321da745e6dbbd&chksm=bd3b594e8a4cd0585f7fbe7b328ae1afb510f9acde6e96642b7b021f2ee66bddc131e1c9c159&scene=21#wechat_redirect
預先建立一堆 partition,有人會為了方便都先建好. <= 這個在實際運用上,還蠻常見的.
Partition 蠻常見的用在 日期範圍, 例如交易資料,事先定義好 年月分割.
大大說的沒錯,很多可能會先建立個一年份。