mysql 橫向分表

2021-08-17 05:47:47 字數 3477 閱讀 3673

分表其實有很多種的方法可行 就像是集群我們也可以叫做是分表 今天給大家演示乙個最簡單的橫向分表

1,建立乙個完整表儲存著所有的成員資訊

create table member(

id bigint auto_increment primary key,

name varchar(20),

*** tinyint not null default '0'

)engine=myisam default charset=utf8 auto_increment=1;

新增資料

insert into member(id,name,***) values (1,'jacson','0');

insert into member(name,***) 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),

*** 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),

*** 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),

*** 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,***) select id,name,*** from member where id%2=0;

insert into tb_member2(id,name,***) select id,name,*** 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資料表結構的各成員資料表必須具有完全一樣的結構。每乙個成員資料表的資料列必須按照同樣的順序定義同樣的名字和型別,索引也必須按照同樣的順序和同樣的方式定義。

以下摘自

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。

檔案內容類似:

t1t2

#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表 -----

mysql分表準則 Mysql分表準則

mysql分表準則 在大量使用mysql時,資料量大 高訪問時,為了提高效能需要分表處理,簡介下mysql分表的標準,後續會繼續補充 環境 業務型別 oltp 硬體 cpu 8cpu 2.4ghz mem 48g 磁碟 raid5 6 sas 什麼樣的表需要拆分 根據表的體積 表的行數 訪問特點來衡...

MySQL 橫向表分割槽之RANGE分割槽小結

mysql 橫向表分割槽之 range 分割槽小結 by 授客qq 1033553122 目錄 簡介1range分割槽1 建立分割槽表 1檢視表分割槽 2新增表分割槽 2新增資料 3分割槽表查詢 3刪除資料 4刪除分割槽 4mysql表分割槽 range 分割槽,屬於橫向分割槽。舉例說,假如有 10...

mysql分表的原則 Mysql分表準則

mysql分表準則 在大量使用mysql時,資料量大 高訪問時,為了提高效能需要分表處理,簡介下mysql分表的標準,後續會繼續補充 環境 業務型別 oltp 硬體 cpu 8cpu 2.4ghz mem 48g 磁碟 raid5 6sas 什麼樣的表需要拆分 根據表的體積 表的行數 訪問特 mys...