點選關註公眾號,Java幹貨 及時送達 👇
來源:blog.csdn.net/joy_tom/article/details/109857573隨著計畫執行的時間越來越長,有些數據的儲存也會越來越大,比如一些點選量,瀏覽量量,單表的數據可以到達上千萬條數據,這時候會存在單表數據過大,查詢效率低的問題。
為了提高查詢效率這時候需要對單表進行拆分,比如一張1000萬條數據的表,我們需要把它拆分為10張表,一張表就需要100萬,mysql中單表都有一個最大儲存的閾值,數據量不能超過這個值;
分表之間,我們需要去生產一個上萬條的數據的表,這裏我生產了如下的數據:
我需要對這張表進行拆分多張,我這裏拆分了2張表;
第一步:
表一:
DROP table IF EXISTS tb_member1;
create table tb_member1(
id bigint primary key auto_increment ,
name varchar(20),
age 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),
age tinyint not null default '0'
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
接下來開始進行拆分:
insert into tb_member1(id,name,sex) select id,name,sex from dd_user where id%2=0;
insert into tb_member2(id,name,sex) select id,name,sex from dd_user where id%2=1;
數據被分為:
這時候表基本是已經拆分完成。
接下來,我們需要考慮的是一張user表被拆分成2張表,那分頁如何實作呢?
第一步:
建立一個主表:
DROP table IF EXISTS tb_member_all;
create table tb_member_all(
id bigint primary key auto_increment ,
name varchar(20),
age tinyint not null default '0'
)ENGINE=MERGE UNION=(tb_member1,tb_member2) INSERT_METHOD=LAST CHARSET=utf8 AUTO_INCREMENT=1 ;
執行上述出現如下問題:
ERROR 1168 (HY000): Unable to open underlying table which is differently defined
or of non-MyISAM type or doesn't exist
需要檢查:
檢視上面的分表資料庫引擎是不是MyISAM.
檢視分表與指標的欄位定義是否一致。
上述的都成功以後,我們會發現,你在
member1
或者
member2
中建立數據
member_all
表中也會出現同樣的數據
所以:
tb_member_all
表就是
tb_member1
,
tb_member2
的聯集,剛剛實作到這裏,我也沒理解,後來看了一些文件,了解了一下:
其實
tb_member_all
表裏面是沒有儲存數據,它就是一個外殼,裏面的數據是
tb_member1
,
tb_member2
的聯集,數據的儲存是放在分表中;
這時候,我們就豁然開朗了,利用這個
tb_member_all
,我們就可以實作數據查詢的分頁;
java程式碼實作:
id%2
這是取模處理,分配數據進入哪個數據;
我們在做分頁的時候就利用
tb_member_all
表去做分頁查詢實作
測試結果: