當一張表的數據量日益增大,i/o效率底下時,分表/分區/分庫勢在必行。
mysql 有提供了兩種解決方案:
第一種是廣為流傳的Partition(分區,在MySQL 5.1.中實現)
第二種就是我們今天要了解的Merge存儲引擎(只支持MyISAM引擎,而分區者沒有限制)
假如我們根據需要對手機註冊賬號的用戶進行分表操作,既定的分表方案為根據手機號尾號分為十張表:s_user_0, s_user_1, s_user_2, s_user_3, s_user_4, s_user_5, s_user_6, s_user_7, s_user_8, s_user_9。
當我們需要通過手機號查詢數據時,只需要根據尾號查詢對應的表即可:
select * from s_user_x where telphone='1531531153x';
但如果我們需要根據用戶暱稱或區域等查詢用戶信息,查詢起來就比較費勁,最直接的方案就是使用union all:
select * from s_user_0 where xx=xx
union all
select * from s_user_1 where xx=xx
union all
select * from s_user_2 where xx=xx
.....
如果有100張表???
看到這麼一串sql你會不會想哭 -_- ~
接下來讓我們看看神奇的Merge存儲引擎解決方案吧
MERGE存儲引擎把一組MyISAM數據表當做一個邏輯單元來對待,讓我們可以同時對他們進行查詢。構成一個MERGE數據表結構的各成員MyISAM數據表必須具有完全一樣的結構。每一個成員數據表的數據列必須按照同樣的順序定義同樣的名字和類型,索引也必須按照同樣的順序和同樣的方式定義。
還是上面的結構,但是創建表的時候必須使用 ENGINE=MYISAM
create table `s_user_0` (
`uuid` varchar(32) not null comment '編號',
`nation` varchar(4) default null comment '國別代碼 中國 86',
`telphone` varchar(15) default null comment '手機號碼',
`nick_name` varchar(30) default null comment '暱稱',
`sex` tinyint(4) default '0' comment '性別 0 未知 1 男性 2女性',
primary key (`uuid`),
unique key `idxu_nat_telphone` (`telphone`,`nation`)
) engine=myisam default charset=utf8mb4 comment='用戶賬號表';
然後創建剩下的表,我們使用like快速創建方式:
create table s_user_1 like s_user_0;
create table s_user_2 like s_user_0;
create table s_user_3 like s_user_0;
......
接下來我們通過MERGE數據表把他們歸攏為一個邏輯單元:
create table `s_user_merge` (
`uuid` varchar(32) not null comment '編號',
`nation` varchar(4) default null comment '國別代碼 中國 86',
`telphone` varchar(15) default null comment '手機號碼',
`nick_name` varchar(30) default null comment '暱稱',
`sex` tinyint(4) default '0' comment '性別 0 未知 1 男性 2女性',
primary key (`uuid`),
unique key `idxu_nat_telphone` (`telphone`,`nation`)
) engine=merge union=(s_user_0, s_user_1, s_user_2, s_user_3, s_user_4, s_user_5, s_user_6, s_user_7, s_user_8, s_user_9) default charset=utf8mb4
insert_method=no;
ENGINE選項的值必須是MERGE,union選項列出了將被收錄在這個MERGE數據表離得各有關數據表。把這個MERGE創建出來後,就可以像對待任何其他數據表那樣查詢它,只是每一次查詢都將同時作用與構成它的每一個成員數據表 。
下面可以輕鬆的對所有表做數據查詢統計等,速度比union方式快了不止一點 ^_^
select * from s_user_merge;
我們可以正常的使用merge表進行數據查詢、更新、刪除,建議關閉新增方法merge=no;
//表示對s_user_merge表做insert插入集合內子表的方法: FIRST(插入第一個表),LAST(最後一個表),NO(不能插入)。
以上觀點由“奇妙策士”發佈,未徵得同意請勿轉載。