首頁 > 軟體

MySql建立分割區的方法範例

2022-04-14 10:04:50

一、Mysql分割區型別

1、RANGE 分割區:基於屬於一個給定連續區間的列值,把多行分配給分割區。

2、HASH分割區:基於使用者定義的表示式的返回值來進行選擇的分割區,該表示式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL中有效的、產生非負整數值的任何表示式。

3、KEY分割區:類似於按HASH分割區,區別在於KEY分割區只支援計算一列或多列,且MySQL伺服器提供其自身的雜湊函數。必須有一列或多列包含整數值。

4、複合分割區:基於RANGE/LIST 型別的分割區表中每個分割區的再次分割。子分割區可以是 HASH/KEY 等型別。

二、RANGE分割區

缺點:1、只能通過整形型別的主鍵建進行分割區

2、分割區資料不平均

1、建立分割區

DROP TABLE IF EXISTS `product_partiton_range`;
CREATE TABLE `product_partiton_range`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `ProductId` int(11) NOT NULL,
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 

PARTITION BY RANGE (Id) PARTITIONS 3 (
PARTITION part0 VALUES LESS THAN (1000), 
PARTITION part1 VALUES LESS THAN (2000), 
PARTITION part2 VALUES LESS THAN MAXVALUE);

2、批次新增資料

DROP PROCEDURE IF EXISTS PROC_USER_INSERT;
delimiter $$
-- 建立儲存過程
CREATE  PROCEDURE PROC_USER_INSERT(
IN START_NUM INT,
IN MAX_NUM INT
)
BEGIN 

DECLARE TEMP_NUM INT DEFAULT 0;
SET TEMP_NUM=START_NUM;

WHILE TEMP_NUM<=MAX_NUM  DO
    INSERT INTO product_partiton_range(ProductName,ProductId) VALUES('XIAOHEMIAO',TEMP_NUM);
    SET TEMP_NUM=TEMP_NUM+1;
END WHILE;


END$$ ;
delimiter;

-- 呼叫儲存過程
CALL PROC_USER_INSERT(1,5000);

3、通過EXPLAIN PARTITIONS命令發現SQL優化器只需搜對應的區,不會搜尋所有分割區

4、如果sql語句有問題,那麼會走所有區。會很危險。所以分割區表後,select語句必須走分割區鍵。

5、檢視當前表的分割區情況

SELECT
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
FROM information_schema.partitions WHERE
table_schema = SCHEMA()
AND table_name='product_partiton_range';

二、Hash分割區

優點:分割區資料比較平均

缺陷:HASH分割區只能對數位欄位進行分割區,無法對字元欄位進行分割區。如果需要對欄位值進行分割區,必須包含在主鍵欄位內

1、建立分割區

DROP TABLE IF EXISTS `product_partiton_hash`;
CREATE TABLE `product_partiton_hash`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `ProductId` int(11) NOT NULL,
  PRIMARY KEY (`Id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 

PARTITION BY HASH (Id) PARTITIONS 3 ;

三、Key分割區

優點:除了text,blob型別欄位,其他型別欄位都可以進行分割區

缺陷:不支援text,blob(二進位制)型別的欄位進行分割區

1、建立分割區

DROP TABLE IF EXISTS `product_partiton_key`;
CREATE TABLE `product_partiton_key`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `ProductId` int(11) NOT NULL,
  PRIMARY KEY (`Id`,`ProductName`) ,
  INDEX `ProductId_index`(`ProductId`) 
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 
PARTITION BY KEY (ProductName) PARTITIONS 3 ;

四、List分割區

優點:支援列舉型別的欄位進行分割區,比如商品狀態,商品型別

1、建立分割區

DROP TABLE IF EXISTS `product_partiton_list`;
CREATE TABLE `product_partiton_list`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `ProductName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `ProductId` int(11) NOT NULL,
    `ProductStatus` int(11) NOT NULL,
  PRIMARY KEY (`Id`,`ProductStatus`) ,
  INDEX `ProductId_index` (`ProductId`) 
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 
PARTITION BY LIST(ProductStatus)(
    PARTITION p0 VALUES in(0,1),
    PARTITION p1 VALUES in(2,3,4)
);

2、插入資料

INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,0);
INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,1);
INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,2);
INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,3);
INSERT INTO product_partiton_list(ProductName,ProductId,ProductStatus) VALUES('XIAOHEMIAO',1,4);

3、檢視當前表的分割區情況

附:查詢分割區,各區表資料量

SELECT PARTITION_NAME,TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'table';

總結

1、分割區欄位必須是主鍵

2、分割區欄位,必須以分割區欄位進行查詢,否則分割區失效

友情連結

https://www.jb51.net/article/244256.htm

https://www.jb51.net/article/244313.htm

https://www.jb51.net/article/244318.htm

到此這篇關於MySql建立分割區的文章就介紹到這了,更多相關MySql建立分割區內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com