mysql-merge合併表,對錶的儲存引擎 有要求
考慮對於 表引擎的限制,
實現 分表查詢 :
但是 這只是滿足於查詢,那麼查詢update 呢??總不能迴圈去查詢每個表吧??
由查詢union all和update的union all可知,update語句是不能直接用union all進行連線。
那麼按條件查詢更新的 操作只能 分步處理了?
innodb 的分表,未驗證:
對於資料量很大的一張表,i/o效率底下,分表勢在必行!使用程式分,對不同的查詢,分配到不同的子表中,是個解決方案,但要改**,對查詢不透明。
好在mysql 有兩個解決方案:
partition(分割槽,在mysql 5.1.中實現) 和 mysql merge儲存引擎。
本文討論 mysql merge儲存引擎。
create table t1 ( a int
not null auto_increment primary key, message char(20));
create table t2 ( a int
not null auto_increment primary key, message char(20));
insert into t1 (message) values ('testing'),('table'),('t1');
insert into t2 (message) values ('testing'),('table'),('t2');
create table total (a int not null auto_increment primary key, message char(20)) engine=merge union=(t1,t2) insert_method=last;
對應定期分表的情況下,只要定期相應的增加乙個基礎表,再修改merge表中的 union 就行了(alter table tbl_name union=(...))。
如在增加乙個表(需和其他基礎表一樣的結構):
create table t3( a int not null auto_increment primary key, message char(20));
alter table total union=(t1,t2,t3)
insert_method=last;表示插入的方法,insert_method的值可以是 first(插入第乙個表),last(最後乙個表),no(不能插入)
需要注意的是 merge表並不維護 「唯一性」檢查,唯一性有各基礎表完成。所以插入新的記錄時候可能和其他基礎表的內容重複。所以再插入去需要用**進行唯一性檢查。
--------------------
非innodb 的主**式如下:
create table `mp_keyword_analysis` (
`id` int(11) not null auto_increment,
`msg` varchar(255) not null comment '訊息內容',
`is_hit` tinyint(1) not null comment '是否命中,1命中,0未命中',
`addtime` int(10) not null comment '時間戳',
`weixin_id` varchar(32) not null,
primary key (`id`)
) engine=mrg_myisam default charset=utf8 insert_method=last union=(`mp_keyword_analysis_20140506105749`);
子表結構:
create table `mp_keyword_analysis_20140506105749` (
`id` int(11) not null auto_increment,
`msg` varchar(255) not null comment '訊息內容',
`is_hit` tinyint(1) not null comment '是否命中,1命中,0未命中',
`addtime` int(10) not null comment '時間戳',
`weixin_id` varchar(32) not null,
primary key (`id`)
) engine=myisam auto_increment=1254 default charset=utf8;
有說使用 cobar 或 mycat中介軟體實現innodb分表的。具體不詳
posted @
2016-09-08 13:26
newman·li 閱讀(
...)
編輯收藏
mysql子查詢更新問題
mysql不支援對同乙個表查詢後做修改 update delete 操作,是其功能問題。原來的sql語句 update t collection contract base base set base.total interest penalty select sum rp.remain inter...
mysql併發更新問題
問題背景 假設mysql資料庫有一張會員表vip member innodb表 結構如下 當乙個會員想續買會員 只能續買1個月 3個月或6個月 時,必須滿足以下業務要求 如果end at早於當前時間,則設定start at為當前時間,end at為當前時間加上續買的月數 如果end at等於或晚於當...
大表中大量資料更新問題
最近遇到個大批量資料更新表字段問題,需要將a表中m欄位儲存的字串進行某種統一格式的替換,where條件類似m like aaa 源資料有1700萬條,需要更新的資料有200多萬條。因為所更新的字段沒有索引,如果用 update set from where m like aaa 更新時需要鎖表,這在...