mysql分表的查詢和更新問題

2021-09-10 02:20:45 字數 2478 閱讀 7421

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 更新時需要鎖表,這在...