mysql 橫向分表

分表其實有很多種的方法可行 就像是集羣我們也可以叫做是分表 今天給大家演示一個最簡單的橫向分表
1,創建一個完整表存儲着所有的成員信息
create table member(
id bigint auto_increment primary key,
name varchar(20),
sex tinyint not null default '0'
)engine=myisam default charset=utf8 auto_increment=1;

添加數據
 insert into member(id,name,sex) values (1,'jacson','0');
  insert into member(name,sex) VALUES ('zxx',1); 
  反覆執行這句
你會看到這個表裏面有很多的數據

2,下面我們進行分表:這裏我們分兩個表tb_member1,tb_member2
DROP table IF EXISTS tb_member1;
create table tb_member1(
    id bigint primary key auto_increment ,
    name varchar(20),
    sex tinyint not null default '0'
)ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

DROP table IF EXISTS tb_member2;
create table tb_member2(
    id bigint primary key auto_increment ,
    name varchar(20),
    sex tinyint not null default '0'
)ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
記住了這表的引擎都是一樣的!

 3,創建主表tb_member
DROP table IF EXISTS tb_member;
create table tb_member(
    id bigint primary key auto_increment ,
    name varchar(20),
    sex tinyint not null default '0'
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;


4,接下來,我們把數據分到兩個分表中去:

insert into tb_member1(id,name,sex) select id,name,sex from member where id%2=0;

insert into tb_member2(id,name,sex) select id,name,sex from member where id%2=1;

這裏的是條件!

查看一下主表的數據:select * from tb_member; 你會發現柱表裏面的數據是分表一 和分表二的結合 
其實再tb_number裏面沒有存儲數據  他就像一個外殼 

存取數據發生在一個一個的分表裏面
 
當在操作數據庫的時候我們需要去判斷數據在那個表裏面  上面我們的數據是基數和偶數去存儲的條件  所以當我們再讀取數據的時候也可以根據用戶的ID的奇偶性去判斷表 當然你可以根據自己的分表去決定如何去選擇表

注意:
1)ENGINE=MERGE
指明使用MERGE引擎,有些同學可能見到過ENGINE=MRG_MyISAM的例子,也是對的,它們是一回事。
2)UNION=(t1, t2)
指明瞭MERGE表中掛接了些哪表,可以通過alter table的方式修改UNION的值,以實現增刪MERGE表子表的功能。
3)INSERT_METHOD=LAST
INSERT_METHOD指明插入方式,取值可以是:0 不允許插入;FIRST 插入到UNION中的第一個表; LAST 插入到UNION中的最後一個表。
4)MERGE表及構成MERGE數據表結構的各成員數據表必須具有完全一樣的結構。每一個成員數據表的數據列必須按照同樣的順序定義同樣的名字和類型,索引也必須按照同樣的順序和同樣的方式定義。

以下摘自http://www.cnblogs.com/luojianqun/p/4903743.html
1)建表時UNION指明的子表如果存在相同主鍵的記錄會怎麼樣?
相同主鍵的記錄會同時存在於MERGE中,就像第三節中的例子所示。但如果繼續向MERGE表中插入數據,若數據主鍵已存在則無法插入。換言之,MERGE表只對建表之後的操作負責。
2)若MREGE後存在重複主鍵,按主鍵查詢會是什麼結果?
順序查詢,只出現一條查詢記錄即停止。比如第三節中的例子,如果執行
1 select * from t where id=1;

只會得到結果
+----+--------+
| id | log    |
+----+--------+
|  1 | test1  |
+----+--------+

3)直接刪除一個子表會出現什麼情況,正確刪除的方式是怎樣的?
MERGE表會被破壞,正確方式是用alter table方式先將子表從MERGE表中去除,再刪除子表。
以第三節中的例子爲例,執行如下操作

可以從MERGE表中去除t2,這裏你可以安全的對t2進行任何操作了。

4)誤刪子表時,如何恢復MERGE表?
誤刪子表時,MERGE表上將無法進行任何操作。
方法1,drop MERGE表,重建。重建時注意在UNION部分去掉誤刪的子表。
方法2,建立MERGE表時,會在數據庫目錄下生成一個.MRG文件,比如設表名爲t,則文件名爲t.MRG。
文件內容類似:
t1
t2
#INSERT_METHOD=LAST
指明瞭MGEGE表的子表構成及插入方式。
可以直接修改此文件,去掉誤刪表的表名。然後執行flush tables即可修復MERGE表。

5)MERGE的子表中之前有記錄,且有自增主鍵,則MERGE表創建後,向其插入記錄時主鍵以什麼規則自增?
以各表中的AUTO_INCREMENT最大值做爲下一次插入記錄的主鍵值。
比如t1的自增ID至6,t2至4,則創建MERGE表後,插入的下一條記錄ID將會是7

6)兩個結構完全相同的但已存在數據的表,是否一定可以合成一個MEREGE表?
從實驗的結果看,不是這樣的,有時創建出的表,無法進行任何操作。
所以,推薦的使用方法是先有一個MERGE表,裏面只包含一張表,當一個這個表的的大小增長到一定程度(比如200w)時,創建另一張空表,將其掛入MERGE表,然後繼續插入記錄。

7)刪除MERGE表是否會對子表產生影響?
不會

8)MREGE表的子表的ENGIN是否有要求?
有的,必須是MyISAM表 -----

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章