MySQL分區(qū)表語法解讀
MySQL分區(qū)表語法
1.創(chuàng)建分區(qū)表
分區(qū)鍵需要和主鍵設(shè)置為復(fù)合主鍵,分區(qū)表不可直接轉(zhuǎn)換成非分區(qū)表,需要重新建非分區(qū)表并導(dǎo)入數(shù)據(jù)
- 按年份
CREATE TABLE partitioned_table_year (
id INT,
content VARCHAR(50),
created_time DATETIME,
PRIMARY KEY (id,created_time)
) PARTITION BY RANGE(YEAR(created_time)) (
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026),
PARTITION p2026 VALUES LESS THAN (2027)
);- 按月份
CREATE TABLE partitioned_table_month (
id INT,
content VARCHAR(50),
created_time DATETIME,
PRIMARY KEY (id,created_time)
) PARTITION BY RANGE COLUMNS(created_time) (
PARTITION p202410 VALUES LESS THAN ('2024-11-01'),
PARTITION p202411 VALUES LESS THAN ('2024-12-01'),
PARTITION p202412 VALUES LESS THAN ('2025-01-01')
);- 修改表結(jié)構(gòu),增加分區(qū)
ALTER TABLE `partitioned_table_month` MODIFY COLUMN `created_time` datetime(0) NOT NULL ,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`, `created_time`) USING BTREE;
ALTER TABLE partitioned_table_month PARTITION BY RANGE COLUMNS(created_time) (
PARTITION p202410 VALUES LESS THAN ('2024-11-01'),
PARTITION p202411 VALUES LESS THAN ('2024-12-01'),
PARTITION p202412 VALUES LESS THAN ('2025-01-01')
);- 刪除分區(qū),注意:刪除分區(qū)的時(shí)候會(huì)同時(shí)刪除數(shù)據(jù)
ALTER TABLE partitioned_table_month DROP PARTITION p202407,p202408;
2.查詢
- 查看表分區(qū)
SELECT
TABLE_NAME,
PARTITION_NAME,
PARTITION_METHOD,
PARTITION_EXPRESSION,
PARTITION_DESCRIPTION,
TABLE_ROWS,
AVG_ROW_LENGTH,
DATA_LENGTH,
INDEX_LENGTH
FROM
information_schema.PARTITIONS
WHERE
TABLE_SCHEMA = 'xxx' and TABLE_NAME = 'partitioned_table_month'; - 查看分區(qū)數(shù)據(jù)
select * from partitioned_table PARTITION (p2024,p2025)
3.利用存儲(chǔ)過程批量修改非分區(qū)表為分區(qū)表
- 創(chuàng)建聯(lián)合主鍵存儲(chǔ)過程,先設(shè)置聯(lián)合主鍵字段非空,再刪除原id去掉主鍵,再設(shè)置聯(lián)合主鍵
DELIMITER $$
DROP PROCEDURE IF EXISTS auto_create_pk$$
CREATE PROCEDURE `auto_create_pk`(IN `table_name` varchar(64),IN `column_name` varchar(64),IN `column_comment` varchar(64))
BEGIN
SET @sql = CONCAT("ALTER TABLE `",table_name,"` MODIFY COLUMN `",column_name,"` datetime NOT NULL COMMENT '",column_comment,"',
DROP PRIMARY KEY,
ADD PRIMARY KEY ( `id`, `",column_name,"` ) USING BTREE;");
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;- 創(chuàng)建按年自動(dòng)分區(qū)存儲(chǔ)過程
DELIMITER $$
DROP PROCEDURE IF EXISTS auto_create_partition_year$$
CREATE PROCEDURE `auto_create_partition_year`(IN `table_name` varchar(64),IN `column_name` varchar(64))
BEGIN
DECLARE partitioned LONGTEXT;
DECLARE n INT;
set n = 2025;
set partitioned = '';
WHILE n <= 2027 DO
SET partitioned = CONCAT(partitioned,",PARTITION p",n," VALUES LESS THAN (",n+1,")");
SET n = n + 1;
END WHILE;
SET @sql = CONCAT ("ALTER TABLE ",table_name," PARTITION BY RANGE(YEAR(",column_name,")) (",SUBSTR(partitioned,2,LENGTH(partitioned)),");") ;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;- 創(chuàng)建按月自動(dòng)分區(qū)存儲(chǔ)過程
DELIMITER $$
DROP PROCEDURE IF EXISTS auto_create_partition_month$$
CREATE PROCEDURE `auto_create_partition_month`(IN `table_name` varchar(64),IN `column_name` varchar(64))
BEGIN
DECLARE partitioned LONGTEXT;
DECLARE n INT;
DECLARE m INT;
set n = 2015;
set partitioned = '';
WHILE n <= 2030 DO
set m = 1;
WHILE m < 12 DO
SET partitioned = CONCAT(partitioned,",PARTITION p",n,LPAD(m,2,0)," VALUES LESS THAN ('",n,"-",LPAD(m+1,2,0),"-01')");
SET m = m + 1;
END WHILE;
IF m = 12 THEN
SET partitioned = CONCAT(partitioned,",PARTITION p",n,"12 VALUES LESS THAN ('",n+1,"-01-01')");
END IF;
SET n = n + 1;
END WHILE;
SET @sql = CONCAT ("ALTER TABLE ",table_name," PARTITION BY RANGE COLUMNS(",column_name,") (",SUBSTR(partitioned,2,LENGTH(partitioned)),");") ;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;-- 查詢存儲(chǔ)過程
show procedure status like 'auto_create_partition%';
-- 執(zhí)行聯(lián)合主鍵
CALL auto_create_pk('table_a','a_time','時(shí)間');
-- 執(zhí)行按年自動(dòng)分區(qū)
CALL auto_create_partition_year('table_b','b_time');
-- 執(zhí)行按月自動(dòng)分區(qū)
CALL auto_create_partition_month('table_c','c_time'); 總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL忘記密碼恢復(fù)密碼的實(shí)現(xiàn)方法
流傳較廣的方法,mysql中文參考手冊(cè)上的,各位vps主機(jī)租用客戶和服務(wù)器托管用戶忘記mysql5.1管理員密碼時(shí),可以使用這種方法破解下2008-07-07
MySQL處理重復(fù)數(shù)據(jù)插入的處理方案
在數(shù)據(jù)庫操作中,處理重復(fù)數(shù)據(jù)插入是一個(gè)常見的需求,特別是在批量插入數(shù)據(jù)時(shí),可能會(huì)遇到主鍵沖突或唯一鍵沖突(Duplicate entry)的情況,本文將以一個(gè)實(shí)際的Python MySQL數(shù)據(jù)庫操作為例,分析如何優(yōu)化異常處理邏輯,需要的朋友可以參考下2025-04-04
mysql中錯(cuò)誤:1093-You can’t specify target table for update in F
最近在工作中遇到了一個(gè)mysql錯(cuò)誤提示1093:You can’t specify target table for update in FROM clause,后來通過查找相關(guān)的資料解決了這個(gè)問題,現(xiàn)在將解決的方法分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧。2017-01-01
MySQL查看用戶權(quán)限及權(quán)限管理的方法詳解
在MySQL中,查看用戶權(quán)限可以通過多種方式實(shí)現(xiàn),主要取決于我們想要查看的權(quán)限類型和詳細(xì)程度,本文給大家介紹了MySQL查看用戶權(quán)限及權(quán)限管理的方法,并通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03
MySQL表字段時(shí)間設(shè)置默認(rèn)值
很多人可能會(huì)把日期類型的字段的類型設(shè)置為 date或者 datetime,但是這些不是當(dāng)前時(shí)間,那么如何把字段時(shí)間設(shè)置成當(dāng)前時(shí)間,本文就具體來介紹一下2021-05-05
Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù)(最新推薦)
這篇文章主要介紹了Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù),實(shí)現(xiàn)原理也很簡(jiǎn)單,mysql刪除重復(fù)數(shù)據(jù),多個(gè)字段分組操作,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
CentOS6.9下mysql 5.7.17安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CentOS6.9下mysql 5.7.17安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

