Mysql 數據庫表分區(流水賬單表數據保留一季度示例)

1.流水賬單表數據保留一季度示例結構圖

流水賬單主表
創建唯一索引
創建觸發器-備份清理的數據
清理批量刪除導致的DataFree
流水賬單備份數據
按月份RANGE分區
1月份
2月份
3月份
4月份

2.創建表

1.基本表結構
CREATE TABLE `withdraw_range` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mid` int(11) DEFAULT NULL,
  `money` decimal(19,2) DEFAULT NULL COMMENT '金額',
  `money_type` int(11) DEFAULT NULL COMMENT '金額類型1應用內貨幣  2現金',
  `type` int(11) DEFAULT NULL COMMENT '類型1任務 2簽到 ',
  `value` bigint(20) DEFAULT NULL,
  `sole` bigint(21) DEFAULT '0',
  `month` int(2) DEFAULT '99' COMMENT '當前數據插入月份',
  `content` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '內容',
  `add_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加時間',
  PRIMARY KEY (`id`,`month`) USING BTREE,
  **UNIQUE KEY `zxt_index` (`sole`,`month`,`type`,`value`,`money_type`) USING BTREE**
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT COMMENT='流水'
PARTITION BY RANGE (`month`) (
    PARTITION p1 VALUES LESS THAN (2),
    PARTITION p2 VALUES LESS THAN (3),
    PARTITION p3 VALUES LESS THAN (4),
    PARTITION p4 VALUES LESS THAN (5),
    PARTITION p5 VALUES LESS THAN (6),
    PARTITION p6 VALUES LESS THAN (7),
    PARTITION p7 VALUES LESS THAN (8),
    PARTITION p8 VALUES LESS THAN (9),
    PARTITION p9 VALUES LESS THAN (10),
    PARTITION p10 VALUES LESS THAN (11),
    PARTITION p11 VALUES LESS THAN (12),
    PARTITION p12 VALUES LESS THAN (13)
);

創建分區後的文件分佈
在這裏插入圖片描述

這裏說一下爲什麼上面的數據表結構爲什麼這麼設計;
在這裏插入圖片描述
RANGE(MONTH(add_time))最直接,爲什麼還要添加一個新的字段來用於分區?
因爲我要用到唯一索引,這個是該表的關鍵;如果直接使用add_time做分區的話,必須在創建唯一索引時把add_time字段添加到唯一索引序列中,所以只能新增一個月份的字段來控制分區;
唯一索引的作用在系統業務中主要用於獎勵重複發放等控制,所以必須要保證這個唯一索引的可用性;

2.創建備份表及觸發器

備份表就不用要唯一索引了

/**創建備份表*/

CREATE TABLE `withdraw_copy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mid` int(11) DEFAULT NULL,
  `money` decimal(19,2) DEFAULT NULL COMMENT '金額',
  `money_type` int(11) DEFAULT NULL COMMENT '金額類型1應用內貨幣  2現金',
  `type` int(11) DEFAULT NULL COMMENT '類型1任務 2簽到 ',
  `value` bigint(20) DEFAULT NULL,
  `sole` bigint(21) DEFAULT '0',
  `month` int(2) DEFAULT '99' COMMENT '當前數據插入月份',
  `content` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '內容',
  `add_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加時間',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=289190 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=COMPACT COMMENT='流水備份';

觸發器名稱 clear_withdraw 在當’數據庫’只能存在一個

CREATE TRIGGER `clear_withdraw` 
AFTER DELETE ON `withdraw_range` FOR EACH ROW 

BEGIN

INSERT INTO extension_withdraw_copy(
   id,mid,money,money_type,type,`value`,`sole`,content,`month`,`add_time`
   ) VALUES(
   old.id,
   old.mid,    
   old.`money`, 
   old.money_type, 
   old.type, 
   old.`value`, 
   old.`sole`, 
   old.content,
   old.`month`,
   old.`add_time`);
   
END;

3.清理批量刪除數據導致的磁盤碎片

/**查詢表空間碎片*/
SELECT 
	DATA_FREE
FROM 
	information_schema.tables
WHERE 
	TABLE_NAME = 'extension_withdraw_range'

清理磁盤碎片會導致鎖表,謹慎使用

ALTER TABLE extension_withdraw_range ENGINE=InnoDB

最後呢,大家根據月份就可以直接刪除了

趙日天第二次用這個編輯器寫:哈哈哈哈!越來越熟練,還是有很多話想說,又表達不出來,難受,看代碼吧!再見;

哦,還有一句話要說:白嫖不好,謝謝;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章