當前位置: 妍妍網 > 碼農

MySQL 分表後,如何做分頁查詢?

2024-02-23碼農

點選關註公眾號,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

需要檢查:

  1. 檢視上面的分表資料庫引擎是不是MyISAM.

  2. 檢視分表與指標的欄位定義是否一致。

上述的都成功以後,我們會發現,你在 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 表去做分頁查詢實作

圖片

圖片

圖片

測試結果:

END


看完本文有收獲?請轉發分享給更多人

關註「Java編程鴨」,提升Java技能

關註Java編程鴨微信公眾號,後台回復:碼農大禮包可以獲取最新整理的技術資料一份。涵蓋Java 框架學習、架構師學習等

文章有幫助的話,在看,轉發吧。

謝謝支持喲 (*^__^*)