MySQL分區表的使用介紹
來源:易賢網 閱讀:2771 次 日期:2015-04-01 16:56:42
溫馨提示:易賢網小編為您整理了“MySQL分區表的使用介紹”,方便廣大網友查閱!

MySQL使用分區表的好處:

1,可以把一些歸類的數據放在一個分區中,可以減少服務器檢查數據的數量加快查詢。

2,方便維護,通過刪除分區來刪除老的數據。

3,分區數據可以被分布到不同的物理位置,可以做分布式有效利用多個硬盤驅動器。

MySQL可以建立四種分區類型的分區:

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

· LIST 分區:類似于按RANGE分區,區別在于LIST分區是基于列值匹配一個離散值集合中的某個值來進行選擇。

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

· KEY 分區:類似于按HASH分區,區別在于KEY分區只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數。必須有一列或多列包含整數值。

一般用得多的是range分區和list分區。

RANGE分區

這里以一個銷售的業務來做測試

銷售表有日期/商品/銷售額三個字段

測試數據從2010年1月1日至2010年9月31日

以“月”為單位進行分區

初期分區定義

首先需要查看,當前 數據庫是否支持分區

mysql>SHOW VARIABLES LIKE '%partition%';

+-------------------+-------+

| Variable_name | Value |

+-------------------+-------+

| have_partitioning | YES |

+-------------------+-------+

1 row in set (0.03 sec)

創建分區表,按照年月的方式分區。

mysql> CREATE TABLE sale_data (

-> sale_date DATETIME NOT NULL,

-> sale_item VARCHAR(2) NOT NULL ,

-> sale_money DECIMAL(10,2) NOT NULL

-> )

-> PARTITION BY RANGE (YEAR(sale_date)*100+MONTH(sale_date)) (

-> PARTITION p201001 VALUES LESS THAN (201002),

-> PARTITION p201002 VALUES LESS THAN (201003),

-> PARTITION p201003 VALUES LESS THAN (201004),

-> PARTITION p201004 VALUES LESS THAN (201005),

-> PARTITION p201005 VALUES LESS THAN (201006),

-> PARTITION p201006 VALUES LESS THAN (201007),

-> PARTITION p201007 VALUES LESS THAN (201008),

-> PARTITION p201008 VALUES LESS THAN (201009),

-> PARTITION p201009 VALUES LESS THAN (201010),

-> PARTITION pcatchall VLAUES LESS THAN MAXVALUE

-> );

Query OK, 0 rows affected (0.20 sec)

新增分區

mysql> ALTER TABLE sale_data

-> ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));

Query OK, 0 rows affected (0.36 sec)

Records: 0 Duplicates: 0 Warnings: 0

刪除分區

--當刪除了一個分區,也同時刪除了該分區中所有的數據。

mysql> ALTER TABLE sale_data DROP PARTITION p201010;

Query OK, 0 rows affected (0.22 sec)

Records: 0 Duplicates: 0 Warnings: 0

分區的合并

下面的SQL,將p201001 - p201009 合并為3個分區p2010Q1 - p2010Q3

mysql> ALTER TABLE sale_data

-> REORGANIZE PARTITION p201001,p201002,p201003,

-> p201004,p201005,p201006,

-> p201007,p201008,p201009 INTO

-> (

-> PARTITION p2010Q1 VALUES LESS THAN (201004),

-> PARTITION p2010Q2 VALUES LESS THAN (201007),

-> PARTITION p2010Q3 VALUES LESS THAN (201010)

-> );

Query OK, 0 rows affected (1.14 sec)

Records: 0 Duplicates: 0 Warnings: 0

分區的拆分

下面的SQL,將p2010Q1 分區,拆分為s2009 與s2010 兩個分區

mysql> ALTER TABLE sale_data REORGANIZE PARTITION p2010Q1 INTO (

-> PARTITION s2009 VALUES LESS THAN (201001),

-> PARTITION s2010 VALUES LESS THAN (201004)

-> );

Query OK, 0 rows affected (0.36 sec)

Records: 0 Duplicates: 0 Warnings: 0

一個利用不同物理位置數據源做分區的例子:

CREATE TABLE ts (id INT, purchased DATE)

ENGINE=innodb

PARTITION BY RANGE(YEAR(purchased))

SUBPARTITION BY HASH(id)

(

PARTITION p0 VALUES LESS THAN (1990)

(

SUBPARTITION s0 //在大的分區下又有小的分區

DATA DIRECTORY='/usr/local/mysql/data0' //數據源

INDEX DIRECTORY='/usr/local/mysql/index0', //索引數據源

SUBPARTITION s1

DATA DIRECTORY='/usr/local/mysql/data1'

INDEX DIRECTORY='/usr/local/mysql/index1'

),

PARTITION p1 VALUES LESS THAN (MAXVALUE)

(

SUBPARTITION s2

DATA DIRECTORY='/usr/local/mysql/data1'

INDEX DIRECTORY='/usr/local/mysql/index1',

SUBPARTITION s3

DATA DIRECTORY='/usr/local/mysql/data2'

INDEX DIRECTORY='/usr/local/mysql/index2'

)

);

分區索引的局限:

1,所有分區都要使用同樣的引擎。

2,分區表的每一個唯一索引必須包含由分區函數引用的列。

3,mysql能避免查詢所有的分區,但仍然鎖定了所有分區。

4,分區函數能使用的函數和表達式有限,例如函數有上面的4種。

5,分區不支持外鍵。

6,不能使用LOAD INDEX INTO CACHE

7,分區并不能總是改善性能,要進行性能評測。

例如可以使用expalin partitions 來查看查詢語句是否使用分區過濾了數據:

mysql> explain partitions select * from fenqubiao where day<'2011-09-12';

+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+

| 1 | SIMPLE | fenqubiao | p_2010,p_2011 | ALL | NULL | NULL | NULL | NULL | 2 | Using where |

+----+-------------+-----------+---------------+------+---------------+------+---------+------+------+-------------+

1 row in set (0.00 sec)

更多信息請查看IT技術專欄

更多信息請查看數據庫
易賢網手機網站地址:MySQL分區表的使用介紹
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
未满十八18勿进黄网站免费看