mysql表分區(qū)詳解

mysql高級(jí)之表分區(qū)

下列說明為個(gè)人見解,歡迎交流指正。

1、表分區(qū)簡(jiǎn)介

1.1 問題概述

問題引出:假設(shè)一個(gè)商城訂單系統(tǒng),每年一個(gè)總表為order_year_2018,最近三個(gè)月有一個(gè)分表order_mouth_3。用戶按年份選擇訂單就到年表中查詢,按最近三個(gè)月選擇訂單就到最近三個(gè)月的分表中查詢,問如何設(shè)計(jì)年表。

為保持讀寫穩(wěn)定,有兩種設(shè)計(jì)方案:

  • 年表不包含近三個(gè)月的表,這樣出現(xiàn)的問題是查詢本年訂單時(shí),需要跨兩張表查詢,如果后面還要連表查詢其它商品等信息再排序可能會(huì)更復(fù)雜。

  • 年表包含近三個(gè)月的表數(shù)據(jù),相當(dāng)于冗余三個(gè)月的數(shù)據(jù)來提高查詢效率,這樣的問題是訂單數(shù)據(jù)發(fā)生變化時(shí),要同時(shí)更新年表和月表,比較麻煩。

問題解決方案:表分區(qū)。

1.2 mysql對(duì)數(shù)據(jù)的存儲(chǔ)

mysql數(shù)據(jù)庫中的數(shù)據(jù)是以文件的形式存在磁盤上的,默認(rèn)放在/mysql/var下面(可以通過my.cnf中的datadir來查看), 對(duì)存儲(chǔ)引擎為myisam來說,一張表主要對(duì)應(yīng)著三個(gè)文件,一個(gè)是frm存放表結(jié)構(gòu)的,一個(gè)是myd存放表數(shù)據(jù)的,一個(gè)是myi存表索引。

如果一張表的數(shù)據(jù)量太大的話,那么myd,myi就會(huì)變的很大,查找數(shù)據(jù)就會(huì)變的很慢,這個(gè)時(shí)候我們可以利用mysql的分區(qū)功能,在物理上將這一張表對(duì)應(yīng)的三個(gè)文件,分割成許多個(gè)小塊,這樣呢,我們查找一條數(shù)據(jù)時(shí),就不用全部查找了,只要知道這條數(shù)據(jù)在哪一塊,然后在那一塊找就行了。如果表的數(shù)據(jù)太大,可能一個(gè)磁盤放不下,這個(gè)時(shí)候,我們可以把數(shù)據(jù)分配到不同的磁盤里面去。

表分區(qū)是mysql被Oracle收購后推出的一個(gè)新特性。

1.3 mysql的表分區(qū)

1.3.1 表分區(qū)

1、分區(qū)表是什么

通俗地講表分區(qū)是將一大表,根據(jù)條件分割成若干個(gè)小表。mysql5.1開始支持?jǐn)?shù)據(jù)表分區(qū)。

如:某用戶表的記錄超過了600萬條,那么就可以根據(jù)入庫日期將表分區(qū),也可以根據(jù)所在地將表分區(qū)。當(dāng)然也可根據(jù)其他的條件分區(qū)。

2、分區(qū)表的原理

分區(qū)表是由多個(gè)相關(guān)的底層表實(shí)現(xiàn),這些底層表也是由句柄對(duì)象表示,所以我們也可以直接訪問各個(gè)分區(qū),存儲(chǔ)引擎管理分區(qū)的各個(gè)底層表和管理普通表一樣(所有的底層表都必須使用相同的存儲(chǔ)引擎),分區(qū)表的索引只是在各個(gè)底層表上各自加上一個(gè)相同的索引,從存儲(chǔ)引擎的角度來看,底層表和一個(gè)普通表沒有任何不同,存儲(chǔ)引擎也無須知道這是一個(gè)普通表還是一個(gè)分區(qū)表的一部分。

在分區(qū)表上的操作按照下面的操作邏輯進(jìn)行:

  • select查詢:當(dāng)查詢一個(gè)分區(qū)表的時(shí)候,分區(qū)層先打開并鎖住所有的底層表,優(yōu)化器判斷是否可以過濾部分分區(qū),然后再調(diào)用對(duì)應(yīng)的存儲(chǔ)引擎接口訪問各個(gè)分區(qū)的數(shù)據(jù)。

  • insert操作:當(dāng)寫入一條記錄時(shí),分區(qū)層打開并鎖住所有的底層表,然后確定哪個(gè)分區(qū)接受這條記錄,再將記錄寫入對(duì)應(yīng)的底層表。

  • delete操作:當(dāng)刪除一條記錄時(shí),分區(qū)層先打開并鎖住所有的底層表,然后確定數(shù)據(jù)對(duì)應(yīng)的分區(qū),最后對(duì)相應(yīng)底層表進(jìn)行刪除操作。

  • update操作:當(dāng)更新一條數(shù)據(jù)時(shí),分區(qū)層先打開并鎖住所有的底層表,mysql先確定需要更新的記錄在哪個(gè)分區(qū),然后取出數(shù)據(jù)并更新,再判斷更新后的數(shù)據(jù)應(yīng)該放在哪個(gè)分區(qū),然后對(duì)底層表進(jìn)行寫入操作,并對(duì)原數(shù)據(jù)所在的底層表進(jìn)行刪除操作

雖然每個(gè)操作都會(huì)打開并鎖住所有的底層表,但這并不是說分區(qū)表在處理過程中是鎖住全表的,如果存儲(chǔ)引擎能夠自己實(shí)現(xiàn)行級(jí)鎖,如:innodb,則會(huì)在分區(qū)層釋放對(duì)應(yīng)的表鎖,這個(gè)加鎖和解鎖過程與普通Innodb上的查詢類似。

1.3.2 表分區(qū)的優(yōu)劣勢(shì)

1、優(yōu)勢(shì)

為了改善大型表以及具有各種訪問模式的表的可伸縮性,可管理性和提高數(shù)據(jù)庫效率。

分區(qū)的一些優(yōu)點(diǎn)包括:

  • 與單個(gè)磁盤或文件系統(tǒng)分區(qū)相比,可以存儲(chǔ)更多的數(shù)據(jù)。
  • 對(duì)于那些已經(jīng)失去保存意義的數(shù)據(jù),通??梢酝ㄟ^刪除與那些數(shù)據(jù)有關(guān)的分區(qū),很容易地刪除那些數(shù)據(jù)。相反地,在某些情況下,添加新數(shù)據(jù)的過程又可以通過為那些新數(shù)據(jù)專門增加一個(gè)新的分區(qū),來很方便地實(shí)現(xiàn)。

通常和分區(qū)有關(guān)的其他優(yōu)點(diǎn)包括下面列出的這些。MySQL分區(qū)中的這些功能目前還沒有實(shí)現(xiàn),但是在我們的優(yōu)先級(jí)列表中,具有高的優(yōu)先級(jí);我們希望在5.1的生產(chǎn)版本中,能包括這些功能。

  • 一些查詢可以得到極大的優(yōu)化,這主要是借助于滿足一個(gè)給定WHERE語句的數(shù)據(jù)可以只保存在一個(gè)或多個(gè)分區(qū)內(nèi),這樣在查找時(shí)就不用查找其他剩余的分區(qū)。因?yàn)榉謪^(qū)可以在創(chuàng)建了分區(qū)表后進(jìn)行修改,所以在第一次配置分區(qū)方案時(shí)還不曾這么做時(shí),可以重新組織數(shù)據(jù),來提高那些常用查詢的效率。
  • 涉及到例如SUM()和COUNT()這樣聚合函數(shù)的查詢,可以很容易地進(jìn)行并行處理。這種查詢的一個(gè)簡(jiǎn)單例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通過“并行”,這意味著該查詢可以在每個(gè)分區(qū)上同時(shí)進(jìn)行,最終結(jié)果只需通過總計(jì)所有分區(qū)得到的結(jié)果。
  • 通過跨多個(gè)磁盤來分散數(shù)據(jù)查詢,來獲得更大的查詢吞吐量。

2、劣勢(shì)

限制暫且歸位劣勢(shì)。

  • 一個(gè)表最多只能有1024個(gè)分區(qū)(mysql5.6之后支持8192個(gè)分區(qū))。
  • 在mysql5.1中分區(qū)表達(dá)式必須是整數(shù),或者是返回整數(shù)的表達(dá)式,在5.5之后,某些場(chǎng)景可以直接使用字符串列和日期類型列來進(jìn)行分區(qū)(使用varchar字符串類型列時(shí),一般還是字符串的日期作為分區(qū))。
  • 如果分區(qū)字段中有主鍵或者唯一索引列,那么所有主鍵列和唯一索引列都必須包含進(jìn)來,如果表中有主鍵或唯一索引,那么分區(qū)鍵必須是主鍵或唯一索引。
  • 分區(qū)表中無法使用外鍵約束。
  • mysql數(shù)據(jù)庫支持的分區(qū)類型為水平分區(qū),并不支持垂直分區(qū),因此,mysql數(shù)據(jù)庫的分區(qū)中索引是局部分區(qū)索引,一個(gè)分區(qū)中既存放了數(shù)據(jù)又存放了索引,而全局分區(qū)是指的數(shù)據(jù)庫放在各個(gè)分區(qū)中,但是所有的數(shù)據(jù)的索引放在另外一個(gè)對(duì)象中
  • 目前mysql不支持空間類型和臨時(shí)表類型進(jìn)行分區(qū)。不支持全文索引。

1.3.3 表分區(qū)的類型

  • RANGE分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
  • LIST分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來進(jìn)行選擇。
  • HASH分區(qū):基于用戶定義的表達(dá)式的返回值來進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
  • KEY分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。

1、RANGE分區(qū)(常用)

基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。這些區(qū)間要連續(xù)且不能相互重疊,使用VALUES LESS THAN操作符來進(jìn)行定義。以下是實(shí)例。

create table employees (
    id int not null,
    fname varchar(30),
    lname varchar(30),
    hired date not null default '1970-01-01',
    separated date not null default '9999-12-31',
    job_code int not null,
    store_id int not null
) partition by range (store_id) (
    partition p0 values less than (6),
    partition p1 values less than (11),
    partition p2 values less than (16),
    partition p3 values less than (21),
    partition p3 values less than maxvalue
);

按照這種分區(qū)方案,在商店1到5工作的雇員相對(duì)應(yīng)的所有行被保存在分區(qū)P0中,商店6到10的雇員保存在P1中,依次類推。注意,每個(gè)分區(qū)都是按順序進(jìn)行定義,從最低到最高。這是PARTITION BY RANGE 語法的要求;在這點(diǎn)上,它類似于C或Java中的“switch ... case”語句。

2、LIST分區(qū)

類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來進(jìn)行選擇。

LIST分區(qū)通過使用“PARTITION BY LIST(expr)”來實(shí)現(xiàn),其中“expr”是某列值或一個(gè)基于某個(gè)列值、并返回一個(gè)整數(shù)值的表達(dá)式,然后通過“VALUES IN (value_list)”的方式來定義每個(gè)分區(qū),其中“value_list”是一個(gè)通過逗號(hào)分隔的整數(shù)列表。

注釋:在MySQL 5.1中,當(dāng)使用LIST分區(qū)時(shí),有可能只能匹配整數(shù)列表。

假定有20個(gè)音像店,分布在4個(gè)有經(jīng)銷權(quán)的地區(qū),如下所示:

====================================
地區(qū)      商店ID 號(hào)
------------------------------------
北區(qū)      3, 5, 6, 9, 17
東區(qū)      1, 2, 10, 11, 19, 20
西區(qū)      4, 12, 13, 14, 18
中心區(qū)   7, 8, 15, 16
====================================

要按照屬于同一個(gè)地區(qū)商店的行保存在同一個(gè)分區(qū)中的方式來分割表,可以使用下面的“CREATE TABLE”語句:

create table employees (
    id int not null,
    fname varchar(30),
    lname varchar(30),
    hired date not null default '1970-01-01',
    separated date not null default '9999-12-31',
    job_code int not null,
    store_id int not null
) partition by list(store_id)
    partition pNorth values in (3,5,6,9,17),
    partition pEast values in (1,2,10,11,19,20),
    partition pWest values in (4,12,13,14,18),
    partition pCentral values in (7,8,15,16)
);

這使得在表中增加或刪除指定地區(qū)的雇員記錄變得容易起來。例如,假定西區(qū)的所有音像店都賣給了其他公司。那么與在西區(qū)音像店工作雇員相關(guān)的所有記錄(行)可以使用查詢“ALTER TABLE employees DROP PARTITION pWest;”來進(jìn)行刪除,它與具有同樣作用的DELETE (刪除)查詢“DELETE query DELETE FROM employees WHERE store_id IN (4,12,13,14,18);”比起來,要有效得多。

要重點(diǎn)注意的是,LIST分區(qū)沒有類似如“VALUES LESS THAN MAXVALUE”這樣的包含其他值在內(nèi)的定義。將要匹配的任何值都必須在值列表中找到。

LIST分區(qū)除了能和RANGE分區(qū)結(jié)合起來生成一個(gè)復(fù)合的子分區(qū),與HASH和KEY分區(qū)結(jié)合起來生成復(fù)合的子分區(qū)也是可能的。

3、HASH分區(qū)

基于用戶定義的表達(dá)式的返回值來進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。

要使用HASH分區(qū)來分割一個(gè)表,要在CREATE TABLE 語句上添加一個(gè)“PARTITION BY HASH (expr)”子句,其中“expr”是一個(gè)返回一個(gè)整數(shù)的表達(dá)式。它可以僅僅是字段類型為MySQL 整型的一列的名字。此外,你很可能需要在后面再添加一個(gè)“PARTITIONS num”子句,其中num 是一個(gè)非負(fù)的整數(shù),它表示表將要被分割成分區(qū)的數(shù)量。

create table employees (
    id int not null,
    fname varchar(30),
    lname varchar(30),
    hired date not null default '1970-01-01',
    separated date not null default '9999-12-31',
    job_code int not null,
    store_id int not null
) partition by hash(store_id)
partitions 4;

如果沒有包括一個(gè)“PARTITIONS num”子句,那么分區(qū)的數(shù)量將默認(rèn)為1。

4、KSY分區(qū)

類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。

create table tk (
    col1 int not null,
    col2 char(5),
    col3 date
) partition by linear key (col1)
partitions 3;

在KEY分區(qū)中使用關(guān)鍵字LINEAR和在HASH分區(qū)中使用具有同樣的作用,分區(qū)的編號(hào)是通過2的冪(powers-of-two)算法得到,而不是通過模數(shù)算法。

1.4 表分區(qū)的相關(guān)操作

1.4.1 建立表分區(qū)

create table employees (
    id int not null,
    fname varchar(30),
    lname varchar(30),
    hired date not null default '1970-01-01',
    separated date not null default '9999-12-31',
    job_code int not null,
    store_id int not null
) partition by range (store_id) (
    partition p0 values less than (6),
    partition p1 values less than (11),
    partition p2 values less than (16),
    partition p3 values less than (21),
    partition p3 values less than maxvalue
);

1.4.2 增加表分區(qū)

PARTITION p1 VALUES LESS THAN (MAXVALUE) 這句要去掉,才可以增加分區(qū)。

ALTER TABLE sale_data ADD PARTITION (PARTITION s20100402 VALUES LESS THAN (20100403));

1.4.3 刪除表分區(qū)

ALTER TABLE sale_data DROP PARTITION s20100406 ;

1.4.4 正常使用

insert into sale_data values('2010-04-01','11',11.11);
insert into sale_data values('2010-04-02','22',22.22);

1.4.5 查看分區(qū)

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

以上轉(zhuǎn)自:表分區(qū)詳解

2、表分區(qū)實(shí)踐

2.1 創(chuàng)建表

分別創(chuàng)建分區(qū)表和不分區(qū)表

# 不分區(qū)表
CREATE TABLE no_part_tab(c1 int default NULL, c2 varchar(30) default NULL, c3 date not null) default charset utf8;

# 分區(qū)表
CREATE TABLE part_tab
(c1 int default NULL, c2 varchar(30) default NULL, c3 date not null)
default charset utf8 
PARTITION BY RANGE(year(c3))
(PARTITION p0 VALUES LESS THAN (1995),
PARTITION p1 VALUES LESS THAN (1996) ,
PARTITION p2 VALUES LESS THAN (1997) ,
PARTITION p3 VALUES LESS THAN (1998) ,
PARTITION p4 VALUES LESS THAN (1999) ,
PARTITION p5 VALUES LESS THAN (2000) ,
PARTITION p6 VALUES LESS THAN (2001) ,
PARTITION p7 VALUES LESS THAN (2002) ,
PARTITION p8 VALUES LESS THAN (2003) ,
PARTITION p9 VALUES LESS THAN (2004) ,
PARTITION p10 VALUES LESS THAN (2010),
PARTITION p11 VALUES LESS THAN (MAXVALUE) );

2.2 插入數(shù)據(jù)

插入相同數(shù)據(jù)(利用存儲(chǔ)過程)

1、創(chuàng)建存儲(chǔ)過程

DELIMITER &&
CREATE PROCEDURE load_part_tab()
  begin
  declare v int default 0;
  while v < 8000000
  do
  insert into part_tab
  values (v,'testingpartitions',adddate('1995-01-01',(rand(v)*36520)mod 3652));
  set v = v + 1;
  end while;
end &&
DELIMITER ;

這里說明下,因?yàn)閙ysql默認(rèn)‘;’號(hào)為語句結(jié)束符,存儲(chǔ)過程也是利用分號(hào)作為語句結(jié)束符,為避免沖突錯(cuò)誤產(chǎn)生,先重定義mysql語句結(jié)束符為‘&&’,后恢復(fù)‘;’。

2、調(diào)用存儲(chǔ)過程

call load_part_tab();

3、復(fù)制表數(shù)據(jù)

insert into no_part_tab select * from part_tab;

2.3 查看表分區(qū)信息

2.3.1 查看創(chuàng)建分區(qū)表語句

show create table `part_tab`;

# 結(jié)果
CREATE TABLE `part_tab` (
 `c1` int(11) DEFAULT NULL,
 `c2` varchar(30) DEFAULT NULL,
 `c3` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY RANGE (year(c3))
(PARTITION p0 VALUES LESS THAN (1995) ENGINE = InnoDB,
PARTITION p1 VALUES LESS THAN (1996) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (1997) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (1998) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (1999) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN (2000) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN (2001) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN (2002) ENGINE = InnoDB,
PARTITION p8 VALUES LESS THAN (2003) ENGINE = InnoDB,
PARTITION p9 VALUES LESS THAN (2004) ENGINE = InnoDB,
PARTITION p10 VALUES LESS THAN (2010) ENGINE = InnoDB,
PARTITION p11 VALUES LESS THAN MAXVALUE ENGINE = InnoDB)

2.3.2 查看表是不是分區(qū)表

show table status like '%part_tab%';


Name                        no_part_tab             part_tab
Engine                      InnoDB                  InnoDB
Version                     10                      10
Row_format                  Dynamic                 Dynamic
Rows                        199500                  199500
Avg_row_length              55                      79
Data_length                 11026432                15925248
Max_data_length             0                       0           
Index_length                0                       0
Data_free                   4194304                 41943040
Auto_increment              NULL                    NULL
Create_time                 2018-02-28 05:43:16     2018-02-28 05:43:53
Update_time                 2018-02-28 06:54:07     2018-02-28 06:47:47
Check_time                  NULL                    NULL
Collation                   utf8_general_ci         utf8_general_ci
Checksum                    NULL                    NULL
Create_options                                      partitioned
Comment

注:為保持對(duì)比效果,手動(dòng)豎向排列布局。

Create_options一欄指示是否分區(qū)。

2.3.3 表分區(qū)詳細(xì)信息

查看information_schema.partitions表。

SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'part_tab'

信息有點(diǎn)多,略去,下面挑幾個(gè)關(guān)鍵字段。

表分區(qū)詳細(xì)信息

2.3.3 表分區(qū)使用信息

explain partitions select * from `part_tab`;
表分區(qū)使用信息

2.4 性能對(duì)比

2.4.1 耗時(shí)對(duì)比

插入數(shù)據(jù)比較耗時(shí),只插入了10w條數(shù)據(jù),耗時(shí)30min。

由于數(shù)據(jù)量比較小,字段少,然后耗時(shí)一樣:(0.07 sec)。

select * from `part_tab`;
select * from `no_part_tab`;

2.4.2 掃描次數(shù)對(duì)比

explain select * from part_tab where c3 > date '1995-01-01'and c3 < date '1995-12-31';

explain select * from no_part_tab where c3 > date '1995-01-01'and c3 < date '1995-12-31';

結(jié)果如下如所示:

表分區(qū)之掃描次數(shù)對(duì)比

如上:普通表掃描了 8000000次, 分區(qū)表掃描了798458次。
分區(qū)表掃描比例是普通表的:20153/199500 = 10.10%。

3、分區(qū)適用場(chǎng)景

3.1 常見使用場(chǎng)景

  • 當(dāng)數(shù)據(jù)量很大(過T)時(shí),肯定不能把數(shù)據(jù)再如到內(nèi)存中,這樣查詢一個(gè)或一定范圍的item是很耗時(shí)。另外一般這情況下,歷史數(shù)據(jù)或不常訪問的數(shù)據(jù)占很大部分,最新或熱點(diǎn)數(shù)據(jù)占的比例不是很大。這時(shí)可以根據(jù)有些條件進(jìn)行表分區(qū)。
  • 分區(qū)表的更易管理,比如刪除過去某一時(shí)間的歷史數(shù)據(jù),直接執(zhí)行truncate,或者狠點(diǎn)drop整個(gè)分區(qū),這比detele刪除效率更高
  • 當(dāng)數(shù)據(jù)量很大,或者將來很大的,但單塊磁盤的容量不夠,或者想提升IO效率的時(shí)候,可以把沒分區(qū)中的子分區(qū)掛載到不同的磁盤上。
  • 使用分區(qū)表可避免某些特殊的瓶頸,例如Innodb的單個(gè)索引的互斥訪問..
  • 單個(gè)分區(qū)表的備份很恢復(fù)會(huì)更有效率,在某些場(chǎng)景下

總結(jié):可伸縮性,可管理性,提高數(shù)據(jù)庫查詢效率。

3.2 業(yè)務(wù)場(chǎng)景舉例

項(xiàng)目中需要?jiǎng)討B(tài)新建、刪除分區(qū)。如新聞表,按照時(shí)間維度中的月份對(duì)其分區(qū),為了防止新聞表過大,只保留最近6個(gè)月的分區(qū),同時(shí)預(yù)建后面3個(gè)月的分區(qū),這個(gè)刪除、預(yù)建分區(qū)的過程就是分區(qū)表的動(dòng)態(tài)管理。

以上參閱:Mysql數(shù)據(jù)庫表分區(qū)深入詳解

4、暫舉一些一些坑

由于目前公司業(yè)務(wù)出現(xiàn)這個(gè)瓶頸,表分區(qū)是一個(gè)解決方案,但是還沒應(yīng)用到實(shí)際中,下面列舉一些搜集的坑。

MySQL5.6 表分區(qū)數(shù)量太多引發(fā)的血案。

key 分區(qū)時(shí),分區(qū)表中數(shù)量不均

下面這個(gè)對(duì)于理解分區(qū)的劣勢(shì)還是很重要的,主要第三點(diǎn)。

分區(qū)鍵必須是唯一鍵

太高級(jí),作為借鑒。

一個(gè)MySQL 5.7 分區(qū)表性能下降的案例分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容