mysql 拆分 記一次MySql的資料拆分

2021-10-17 11:43:34 字數 1548 閱讀 9469

前言

早上上班的時候,查詢資料突然發現比較慢,於是去檢視資料庫,結果發現表資料已經達到了千萬級別,於是就準備拆分一下資料表.

思路由於資料表 table_one 資料非常龐大,並且線上業務也在不定時的往表裡寫入資料,所以這裡不會考慮資料遷移.

這裡採用的方式為資料分類: 歷史冷資料 和 近期熱資料 .

通過一定的業務條件將 table_one 中的資料進行分類 ,最終形成的分模擬例為 10(歷史) : 1(近期) ,或者歷史冷資料更大.

步驟改表名: 修改原資料表名 table_one 改為 table_old ,即使 table_one 中的資料非常龐大,但是改表也是毫秒級的.

建立新錶: 重新建立一張新錶 table_one , 如果線上業務有資料處理,它也會進入到新錶中.這裡的 auto_increment 設定為 10005000 預留了 5000 容錯資料 .

批量新增: 根據資料分類的條件 (這裡是 type = 1) ,將 近期熱資料 寫入到 table_one 中 .這裡值得注意的是,查詢新增的資料不能大於 mysql 的最大記憶體值.(資料大約為 500萬條),否則會出現 out of memory .

檢測 table_old 中符合條件的最大id,是否在 table_one 中

如果沒有資料,則根據 table_old 和 table_one 中的 id 差集 ,新增沒有的資料

實現-- 1.改表名

alter table `table_one` rename to `table_old`;

-- 2.建立新錶 table_one , auto_increment 擴大一定的範圍

create table `table_one` (

`id` int(11) unsigned not null auto_increment,

`name` varchar(50) not null default '' comment '名稱',

`type` tinyint(2) unsigned not null default '0' comment '型別',

primary key (`id`),

key `type` (`type`) using btree

) engine=innodb auto_increment=10005000 default charset=utf8 comment='原始表';

-- 3.批量新增

insert into `talbe_one` (`id`,`name`,`type`)

select * from `table_old` where type = 1 ;

-- 4.檢測 table_old 中符合條件的最大id,是否在 table_one 中

select * from `table_one` where id = (

select max(id) from `table_old` where type = 1

-- 5.如果沒有資料,則根據 table_old 和 table_one 中的 id 差集 ,新增沒有的資料

tips : 資料拆分的方式有很多,具體還是要看自己的業務資料和業務場景 !

mysql安裝一次 記一次mysql安裝

mysql 分為安裝版和壓縮版 2.安裝 2.1 解壓得到 mysql 8.0.15 winx64 資料夾 2.2 在mysql 8.0.15 winx64 資料夾下,新建配置檔案my.ini,內容 如下 mysqld 設定3306埠 port 3306 設定mysql的安裝目錄,這裡是唯一你需要改...

記一次mysql宕機

e warning pdo prepare mysql server has gone away pdo prepare mysql server has gone awayilluminate database queryexception sqlstate hy000 2002 connecti...

記一次安裝MySQL

之前在電腦上安裝過一次mysql,使用的公司的一鍵安裝指令碼,後來刪除了一遍,在安裝就會出錯了,提示無法啟動計算機上的 服務,查了一下,應該是以前的指令碼有殘留檔案,導致這個無法安裝。解決辦法 將mysql解壓檔案解壓出來後,放到要放的目錄,之後配置環境變數 d sunbox lib mysql b...