Mysql四種分區(qū)方式以及組合分區(qū)落地實(shí)現(xiàn)詳解
看這篇文章前需要先了解一下以下幾個問題~
一、問題
1.分區(qū)是什么
分區(qū):就是把一張表數(shù)據(jù)分塊存儲
目的:提升索引的查詢效率
2.Mysql為什么要使用分區(qū)
先從數(shù)據(jù)分析
然后進(jìn)行索引優(yōu)化
然后引入分區(qū)
3.Mysql中分區(qū)原理
客戶端---------> Id 和分區(qū)鍵進(jìn)行比較------------->找到指定分區(qū)---------->和數(shù)據(jù)庫查詢一致
4.Mysql中分區(qū)局限
必須使用分區(qū)字段才行,不然分區(qū)查詢就會失敗。走所有分區(qū)。
目前Range是范圍分區(qū),但是有時候我們會發(fā)現(xiàn)。分區(qū)大小永遠(yuǎn)是靜態(tài)的。
所以會存在一個分區(qū)表大小不均。如何讓分區(qū)表大小均衡呢?
二、分區(qū)落地實(shí)現(xiàn)
1.Range分區(qū)
條件
- Product-Partiton表
步驟
1、先創(chuàng)建Product-Partiton-Range
CREATE TABLE `product-Partiton-Range` ( `Id` BIGINT(8) NOT NULL, `ProductName` CHAR(245) NOT NULL DEFAULT '1', `ProductId` CHAR(255) NOT NULL DEFAULT '1', `ProductDescription` CHAR(255) NOT NULL DEFAULT '1', `ProductUrl` CHAR(255) NOT NULL DEFAULT '1', PRIMARY KEY (`Id`), INDEX `ProductId` (`ProductId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PARTITION BY RANGE (Id) PARTITIONS 3 ( PARTITION part0 VALUES LESS THAN (12980), PARTITION part1 VALUES LESS THAN (25960), PARTITION part2 VALUES LESS THAN MAXVALUE);
2、然后查詢分區(qū)表
select * from product-Partiton-Range where Id = 25000
2.Hash分區(qū)
步驟
1、先創(chuàng)建Product-Partiton-Hash
CREATE TABLE `product-Partiton-Hash` ( `Id` BIGINT(8) NOT NULL, `ProductName` CHAR(245) NOT NULL DEFAULT '1', `ProductId` CHAR(255) NOT NULL DEFAULT '1', `ProductDescription` CHAR(255) NOT NULL DEFAULT '1', `ProductUrl` CHAR(255) NOT NULL DEFAULT '1', PRIMARY KEY (`Id`), INDEX `ProductId` (`ProductId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PARTITION BY HASH (Id) PARTITIONS 3;
Hash分區(qū)只能進(jìn)行數(shù)字字段進(jìn)行分區(qū),無法進(jìn)行字符字段進(jìn)行分區(qū)。如果需要對字段值進(jìn)行分區(qū)。
必須包含在主鍵字段內(nèi)。
3.Key分區(qū)
步驟
1、先創(chuàng)建Product-Partiton-Key
CREATE TABLE `product-Partiton-Key` ( `Id` BIGINT(8) NOT NULL, `ProductName` CHAR(245) NOT NULL DEFAULT '1', `ProductId` CHAR(255) NOT NULL DEFAULT '1', `ProductDescription` CHAR(255) NOT NULL DEFAULT '1', `ProductUrl` CHAR(255) NOT NULL DEFAULT '1', PRIMARY KEY (`Id`), INDEX `ProductId` (`ProductId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PARTITION BY KEY (ProductName) PARTITIONS 3; #建立復(fù)合主鍵 CREATE TABLE `product-Partiton-Key` ( `Id` BIGINT(8) NOT NULL, `ProductName` CHAR(245) NOT NULL DEFAULT '1', `ProductId` CHAR(255) NOT NULL DEFAULT '1', `ProductDescription` CHAR(255) NOT NULL DEFAULT '1', `ProductUrl` CHAR(255) NOT NULL DEFAULT '1', PRIMARY KEY (`Id`), INDEX `ProductId` (`ProductId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PARTITION BY KEY (ProductName) PARTITIONS 3;
以上分區(qū)都是一個特點(diǎn):所有的分區(qū)必須連續(xù)和連續(xù)大小進(jìn)行分區(qū)。
我們再來看一個場景:如何對商品訂單分區(qū)。
4.Mysql中如何落地List分區(qū)
步驟
1、先創(chuàng)建Product-Partiton-List
CREATE TABLE `product-Partiton-List` ( `Id` BIGINT(8) NOT NULL, `ProductName` CHAR(245) NOT NULL DEFAULT '1', `ProductId` CHAR(255) NOT NULL DEFAULT '1', `ProductDescription` CHAR(255) NOT NULL DEFAULT '1', `ProductUrl` CHAR(255) NOT NULL DEFAULT '1', `ProductStatus` int NOT NULL DEFAULT 0, PRIMARY KEY (`Id`), INDEX `ProductId` (`ProductId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PARTITION BY LIST(ProductId) ( PARTITION a VALUES IN (1,5,6), PARTITION b VALUES IN (2,7,8) );
商品主鍵和商品名稱進(jìn)行分區(qū)。
5.Mysql中如何落地組合分區(qū)
步驟
CREATE TABLE `product-Partiton-flex` ( `Id` BIGINT(8) NOT NULL, `ProductName` CHAR(245) NOT NULL DEFAULT '1', `ProductId` CHAR(255) NOT NULL DEFAULT '1', `ProductDescription` CHAR(255) NOT NULL DEFAULT '1', `ProductUrl` CHAR(255) NOT NULL DEFAULT '1', PRIMARY KEY (`Id`,`ProductName`), INDEX `ProductId` (`ProductId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PARTITION BY RANGE (Id) PARTITIONS 3 SUBPARTITION BY KEY(ProductName) SUBPARTITIONS 2 ( PARTITION p0 VALUES LESS THAN (12980), PARTITION p1 VALUES LESS THAN (25960), PARTITION p2 VALUES LESS THAN MAXVALUE );
三、Mysql如何管理分區(qū)
1.刪除分區(qū)
ALERT TABLE users DROP PARTITION p0; #刪除分區(qū) p0
2.重建分區(qū)
2.1RANGE 分區(qū)重建
ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES LESS THAN (6000000)); #將原來的 p0,p1 分區(qū)合并起來,放到新的 p0 分區(qū)中。
2.2 LIST 分區(qū)重建
ALTER TABLE users REORGANIZE PARTITION p0,p1 INTO (PARTITION p0 VALUES IN(0,1,4,5,8,9,12,13)); #將原來的 p0,p1 分區(qū)合并起來,放到新的 p0 分區(qū)中。
2.3 HASH/KEY 分區(qū)重建
ALTER TABLE users REORGANIZE PARTITION COALESCE PARTITION 2; #用 REORGANIZE 方式重建分區(qū)的數(shù)量變成2,在這里數(shù)量只能減少不能增加。想要增加可以用 ADD PARTITION 方法。
3. 新增分區(qū)
3.1 新增 RANGE 分區(qū)
#新增一個RANGE分區(qū) ALTER TABLE category ADD PARTITION (PARTITION p4 VALUES IN (16,17,18,19) DATA DIRECTORY = '/data8/data' INDEX DIRECTORY = '/data9/idx');
3.2 新增 HASH/KEY 分區(qū)
ALTER TABLE users ADD PARTITION PARTITIONS 8; #將分區(qū)總數(shù)擴(kuò)展到8個。
3.3 給已有的表加上分區(qū)
alter table results partition by RANGE (month(ttime)) ( PARTITION p0 VALUES LESS THAN (1), 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) );
4.默認(rèn)分區(qū)限制分區(qū)字段必須是主鍵(PRIMARY KEY)的一部分,去除此限制
[方法1] 使用ID:
mysql> ALTER TABLE np_pk -> PARTITION BY HASH( TO_DAYS(added) ) -> PARTITIONS 4; #ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function mysql> ALTER TABLE np_pk -> PARTITION BY HASH(id) -> PARTITIONS 4; Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0
[方法2] 將原有PK去掉生成新PK
mysql> alter table results drop PRIMARY KEY; Query OK, 5374850 rows affected (7 min 4.05 sec) Records: 5374850 Duplicates: 0 Warnings: 0 mysql> alter table results add PRIMARY KEY(id, ttime); Query OK, 5374850 rows affected (7 min 4.05 sec) Records: 5374850 Duplicates: 0 Warnings: 0
總結(jié)
到此這篇關(guān)于Mysql四種分區(qū)方式以及組合分區(qū)落地實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Mysql組合分區(qū)落地內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL中列轉(zhuǎn)行和行轉(zhuǎn)列總結(jié)解決思路
最近工作中用到了好幾次列轉(zhuǎn)行,索性做個小總結(jié),下面這篇文章主要給大家介紹了關(guān)于MYSQL如何列轉(zhuǎn)行的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01MySQL數(shù)據(jù)庫索引原理及優(yōu)化策略
MySQL數(shù)據(jù)庫索引是一種數(shù)據(jù)結(jié)構(gòu),用于提高數(shù)據(jù)查詢的效率,加快數(shù)據(jù)檢索的速度。索引基于樹結(jié)構(gòu)實(shí)現(xiàn),可以通過B+樹等算法來優(yōu)化索引效率。MySQL中常見的索引類型包括主鍵索引、唯一索引、普通索引、全文索引等2023-04-04Centos 5.2下安裝多個mysql數(shù)據(jù)庫配置詳解
在實(shí)際應(yīng)用中,有時候,我們需要在同一臺服務(wù)器上安裝兩個甚至多個mysql數(shù)據(jù)庫,那么,如何來操作呢,今天我們就來探討下這個問題2014-07-07Linux下MySQL5.7.18 yum方式從卸載到安裝過程圖解
這篇文章主要介紹了Linux下MySQL5.7.18 yum方式從卸載到安裝過程圖解,需要的朋友可以參考下2017-06-06MySQL分區(qū)表實(shí)現(xiàn)按月份歸類
mysql 單表數(shù)據(jù)量達(dá)到千萬、億級,可以通過分表與表分區(qū)提升服務(wù)性能。本文主要介紹了MySQL分區(qū)表實(shí)現(xiàn)按月份歸類,感興趣的可以了解一下2021-10-10mysql group by having 實(shí)例代碼
mysql中g(shù)roup by語句用于分組查詢,可以根據(jù)給定數(shù)據(jù)列的每個成員對查詢結(jié)果進(jìn)行分組統(tǒng)計,最終得到一個分組匯總表, 經(jīng)常和having一起使用,需要的朋友可以參考下2016-11-11Mysql?innoDB修改自增id起始數(shù)的方法步驟
本文主要介紹了Mysql?innoDB修改自增id起始數(shù)的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2023-03-03MySQL處理DB讀寫分離數(shù)據(jù)不一致問題的方案
在互聯(lián)網(wǎng)中大型項(xiàng)目中,讀寫分離應(yīng)該是我們小伙伴經(jīng)常聽說的,這個主要解決大流量請求時,提高系統(tǒng)的吞吐量,本文給大家介紹了MySQL處理DB讀寫分離數(shù)據(jù)不一致問題的方案,需要的朋友可以參考下2024-02-02