前言
早上上班的時候,查詢資料突然發現比較慢,於是去檢視資料庫,結果發現表資料已經達到了千萬級別,於是就準備拆分一下資料表.
思路由於資料表 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...