MySql橫向分表

MySql橫向分表

現階段主流互聯網公司的業務量都很大,很容易就導致業務表變得臃腫,查詢效率變低,再怎麼優化sql;加索引最終還是不能解決問題,但是這些數據又必須要保存。這個時候就要考慮分表或者分庫了。

這裏主要討論如何去分表,分庫之後再討論
1.根據表主鍵值範圍分:比如1~2000放到tb_1;2001~4000放到tb_2
2.根據數值取模:餘數爲0放tb_1;餘數爲1放tb_2。這樣做有一個好處比如按用戶id來分,同一個用戶的數據就會落在一個表上,查詢的時候可以指定這張表查詢不需要遍歷。

建表

DROP table IF EXISTS tb_user_1;
CREATE TABLE tb_user_1 (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) CHARACTER SET utf8mb4 NOT NULL,
loginName varchar(45) DEFAULT NULL,
password varchar(64) CHARACTER SET latin1 NOT NULL,
createDt datetime DEFAULT NULL,
email varchar(45) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

DROP table IF EXISTS tb_user_2;
CREATE TABLE tb_user_2 (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) CHARACTER SET utf8mb4 NOT NULL,
loginName varchar(45) DEFAULT NULL,
password varchar(64) CHARACTER SET latin1 NOT NULL,
createDt datetime DEFAULT NULL,
email varchar(45) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

創建主表

CREATE TABLE tb_user (
id bigint NOT NULL AUTO_INCREMENT,
name varchar(50) CHARACTER SET utf8mb4 NOT NULL,
loginName varchar(45) DEFAULT NULL,
password varchar(64) CHARACTER SET latin1 NOT NULL,
createDt datetime DEFAULT NULL,
email varchar(45) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (id) USING BTREE
) ENGINE=MERGE UNION=(tb_user_1,tb_user_2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1;

插入數據

insert into tb_user_1(id,name,loginName,password,createDt,email) select id,name,loginName,password,createDt,email from user where id%2=0;

insert into tb_user_2(id,name,loginName,password,createDt,email) select id,name,loginName,password,createDt,email from user where id%2=1;

user表是業務數據表

tb_user表沒有主動插入數據,實際上去查詢是有數據的,是分表tb_user_1和tb_user_2的數據集合。這是MERGE引擎的作用。

注意:

1)ENGINE=MERGE
MERGE存儲引擎把一組MyISAM數據表當做一個邏輯單元來對待,讓我們可以同時對他們進行查詢,注意刪除MERGE表的數據等於是刪除了分表的數據。
2)UNION=(t1, t2)
指明瞭MERGE表中掛接了些哪表,可以通過alter table的方式修改UNION的值,以實現增刪MERGE表子表的功能。
3)INSERT_METHOD=LAST
INSERT_METHOD指明插入方式,取值可以是:0 不允許插入;FIRST 插入到UNION中的第一個表; LAST 插入到UNION中的最後一個表。
4)MERGE表及構成MERGE數據表結構的各成員數據表必須具有完全一樣的結構。每一個成員數據表的數據列必須按照同樣的順序定義同樣的名字和類型,索引也必須按照同樣的順序和同樣的方式定義。

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