MySQL分表后,如何做分頁(yè)查詢?
點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)??
來(lái)源:blog.csdn.net/joy_tom/article/details/109857573
隨著項(xiàng)目運(yùn)行的時(shí)間越來(lái)越長(zhǎng),有些數(shù)據(jù)的存儲(chǔ)也會(huì)越來(lái)越大,比如一些點(diǎn)擊量,瀏覽量量,單表的數(shù)據(jù)可以到達(dá)上千萬(wàn)條數(shù)據(jù),這時(shí)候會(huì)存在單表數(shù)據(jù)過(guò)大,查詢效率低的問(wèn)題。
為了提高查詢效率這時(shí)候需要對(duì)單表進(jìn)行拆分,比如一張1000萬(wàn)條數(shù)據(jù)的表,我們需要把它拆分為10張表,一張表就需要100萬(wàn),mysql中單表都有一個(gè)最大存儲(chǔ)的閾值,數(shù)據(jù)量不能超過(guò)這個(gè)值;
分表之間,我們需要去生產(chǎn)一個(gè)上萬(wàn)條的數(shù)據(jù)的表,這里我生產(chǎn)了如下的數(shù)據(jù):

我需要對(duì)這張表進(jìn)行拆分多張,我這里拆分了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 ;
接下來(lái)開(kāi)始進(jìn)行拆分:
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;
數(shù)據(jù)被分為:


這時(shí)候表基本是已經(jīng)拆分完成。
接下來(lái),我們需要考慮的是一張user表被拆分成2張表,那分頁(yè)如何實(shí)現(xiàn)呢?
第一步:
創(chuàng)建一個(gè)主表:
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 ;
執(zhí)行上述出現(xiàn)如下問(wèn)題:
ERROR 1168 (HY000): Unable to open underlying table which is differently defined
or of non-MyISAM type or doesn't exist
需要檢查:
查看上面的分表數(shù)據(jù)庫(kù)引擎是不是MyISAM. 查看分表與指標(biāo)的字段定義是否一致。
上述的都成功以后,我們會(huì)發(fā)現(xiàn),你在member1或者member2中創(chuàng)建數(shù)據(jù)member_all表中也會(huì)出現(xiàn)同樣的數(shù)據(jù)
所以:tb_member_all表就是tb_member1,tb_member2的并集,剛剛實(shí)現(xiàn)到這里,我也沒(méi)理解,后來(lái)看了一些文檔,了解了一下:

其實(shí)tb_member_all表里面是沒(méi)有存儲(chǔ)數(shù)據(jù),它就是一個(gè)外殼,里面的數(shù)據(jù)是tb_member1,tb_member2的并集,數(shù)據(jù)的存儲(chǔ)是放在分表中;



這時(shí)候,我們就豁然開(kāi)朗了,利用這個(gè)tb_member_all,我們就可以實(shí)現(xiàn)數(shù)據(jù)查詢的分頁(yè);
java代碼實(shí)現(xiàn):

id%2這是取模處理,分配數(shù)據(jù)進(jìn)入哪個(gè)數(shù)據(jù);
我們?cè)谧龇猪?yè)的時(shí)候就利用tb_member_all表去做分頁(yè)查詢實(shí)現(xiàn)



測(cè)試結(jié)果:

1. Spring 6.0 要來(lái)了,太強(qiáng)了!
2. 設(shè)計(jì)了一個(gè)支撐 數(shù)億 用戶的系統(tǒng)
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù) Java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
PS:因公眾號(hào)平臺(tái)更改了推送規(guī)則,如果不想錯(cuò)過(guò)內(nèi)容,記得讀完點(diǎn)一下“在看”,加個(gè)“星標(biāo)”,這樣每次新文章推送才會(huì)第一時(shí)間出現(xiàn)在你的訂閱列表里。
點(diǎn)“在看”支持小哈呀,謝謝啦

