TiDB 表分區

前置條件
對比MySQL的表分區
使用之前,要先讀官方文檔



表分區,注意事項
  1. 確認表中是否存在唯一鍵(包括主鍵) ,如果存在,那麼唯一鍵 中,必須包含分區表達式中用到的所有列
  2. 如果表中不存在唯一鍵 ,那麼第1條規則也就不需要遵守了
  3. 分區列是主鍵列,那麼分區列不可以是 NULL
  4. 分區表達式中列的數據類型,要與表中列的數據類型相符合
  5. 刪除分區一定會刪除分區中所有數據,不會自動轉移數據
  6. MAXVALUE 因爲添加分區必須是遞增的,添加此分區時要注意,此分區表示已經是最大的分區,無法在添加新的分區。



1 表分區 RANGE
-- 創建表
CREATE TABLE table_range (
  a bigint(20) DEFAULT NULL,
  b varchar(255) DEFAULT NULL,
  c int(11) DEFAULT NULL,
  d date DEFAULT NULL,
  KEY m_index (a,b,c)
)
-- 創建 RANGE 表分區 按照年分區
PARTITION BY RANGE(YEAR(d)) (
    PARTITION p0 VALUES LESS THAN (1900),
    PARTITION p1 VALUES LESS THAN (2010),
    PARTITION p2 VALUES LESS THAN MAXVALUE
);

-- 添加數據
INSERT INTO table_range VALUES (1,'1',1,'1900-01-01'), (2,'2',2,'2009-02-02'), (3,'3',3,'2019-03-03');

-- 添加表分區
-- ALTER TABLE table_range ADD PARTITION (PARTITION p3 VALUES LESS THAN (2014));

-- 清空表分區
-- ALTER TABLE table_range TRUNCATE PARTITION p1;

-- 刪除表分區
-- ALTER TABLE table_range DROP PARTITION p3;

-- 查詢數據 1900~2009 之間的數據,這裏只會查詢 p0 表分區
SELECT * FROM table_range WHERE d > 1900 AND d < 2009;

-- 指定查詢 p1 表分區
SELECT * FROM table_range PARTITION (p1);

-- 創建表
CREATE TABLE table_range (
  a bigint(20) DEFAULT NULL,
  b varchar(255) DEFAULT NULL,
  c int(11) DEFAULT NULL,
  d date DEFAULT NULL,
  KEY m_index (a,b,c)
)
-- 創建 RANGE 表分區 按照 年、月、日 分區
PARTITION BY RANGE(TO_DAYS(d)) (
    PARTITION p0 VALUES LESS THAN (TO_DAYS('2017-02-01')),
    PARTITION p1 VALUES LESS THAN (TO_DAYS('2017-03-01')),
    PARTITION p2 VALUES LESS THAN MAXVALUE
);

-- 創建表
CREATE TABLE table_range (
  a bigint(20) DEFAULT NULL,
  b varchar(255) DEFAULT NULL,
  c int(11) DEFAULT NULL,
  d TIMESTAMP DEFAULT NULL,
  KEY m_index (a,b,c)
)
-- 創建 RANGE 表分區 按照 時間戳 分區
PARTITION BY RANGE(UNIX_TIMESTAMP(d)) (
    PARTITION p0 VALUES LESS THAN (UNIX_TIMESTAMP('2017-02-01 00:00:00')),
    PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2017-03-01 00:00:00')),
    PARTITION p2 VALUES LESS THAN MAXVALUE
);

查詢系統表中記錄的表分區
SELECT
    PARTITION_NAME AS '分區名稱',
    FROM_DAYS(PARTITION_DESCRIPTION) AS '原分區條件',
    PARTITION_EXPRESSION AS '分區表達式',
    PARTITION_DESCRIPTION AS '分區條件',
    TABLE_ROWS AS '分區中數據行數'
FROM
    INFORMATION_SCHEMA.PARTITIONS
WHERE
    TABLE_SCHEMA = 'prd2_pfizer'
    AND TABLE_NAME = 'dc_flowdata_deliver_sale_range';



2 表分區 HASH


-- 創建表
CREATE TABLE table_hash (
  a bigint(20) DEFAULT NULL,
  b varchar(255) DEFAULT NULL,
  c int(11) DEFAULT NULL,
  d date DEFAULT NULL,
  KEY m_index (a,b,c)
)
-- 創建 HASH 表分區
PARTITION BY HASH(YEAR(d))
PARTITIONS 6;

-- 添加數據
INSERT INTO table_hash VALUES (1,'1',1,'1900-01-01'), (2,'2',2,'2009-02-02'), (3,'3',3,'2019-03-03');

案例

CREATE TABLE `dc_flowdata` (
  `distributor_code` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '客戶編碼',
  `distributor_name` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '客戶名稱',
  `specification` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '產品規格',
  `manufacturer` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '生產廠家',
  `lot_no` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '產品批號',
  `expiry_date` date DEFAULT NULL COMMENT '有效期',
  `paas_create_ntid` varchar(32) COLLATE utf8_general_ci DEFAULT '' COMMENT '創建人NTID',
  `paas_update_ntid` varchar(32) COLLATE utf8_general_ci DEFAULT '' COMMENT '修改人NTID',
	
  PRIMARY KEY (`biz_date`,`paas_id`),
  KEY `index1` (biz_date,paas_is_del,normal_product_code,normal_organ_code,br_status,distributor_code,normal_inventory_state),
	KEY `index_source_file_id` (`source_file_id`)
	
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='庫存數據'



PARTITION BY RANGE(TO_DAYS(biz_date)) (
    PARTITION p200001 VALUES LESS THAN ( TO_DAYS('2000-01-01 00:00:00') ),
	PARTITION p201701 VALUES LESS THAN ( TO_DAYS('2017-02-01 00:00:00') ),
	PARTITION p201702 VALUES LESS THAN ( TO_DAYS('2017-03-01 00:00:00') ),
	PARTITION p201703 VALUES LESS THAN ( TO_DAYS('2017-04-01 00:00:00') ),
	PARTITION p201704 VALUES LESS THAN ( TO_DAYS('2017-05-01 00:00:00') ),
	PARTITION p201705 VALUES LESS THAN ( TO_DAYS('2017-06-01 00:00:00') ),
	PARTITION p201706 VALUES LESS THAN ( TO_DAYS('2017-07-01 00:00:00') )

);

只有以下函數可以用於分區表達式:

ABS()
CEILING() (see CEILING() and FLOOR())
DATEDIFF()
DAY()
DAYOFMONTH()
DAYOFWEEK()
DAYOFYEAR()
EXTRACT() (see EXTRACT() function with WEEK specifier)
FLOOR() (see CEILING() and FLOOR())
HOUR()
MICROSECOND()
MINUTE()
MOD()
MONTH()
QUARTER()
SECOND()
TIME_TO_SEC()
TO_DAYS()
TO_SECONDS()
UNIX_TIMESTAMP() (with TIMESTAMP columns)
WEEKDAY()
YEAR()
YEARWEEK()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章