首頁  >  文章  >  資料庫  >  MySQL高級十五-表格的分區

MySQL高級十五-表格的分區

黄舟
黄舟原創
2016-12-29 17:00:40996瀏覽

1、為什麼要採用分區?

當資料量過大的時候(通常是指百萬級或千萬級資料的時候),這個時候需要將一張表的資料分割幾張表格儲存。有些查詢可以得到極大的最佳化,這主要是藉用滿足一個給定WHERE語句的資料可以只保存在一個或多個分割區內,這樣在尋找時就不用找其他剩餘的分割區。

2、查看mysql是否支援分割區

透過以下指令去查看mysql是否支援分割區? ?

show variables like '%partition%';


——如果輸出的變數為yes表示mysql是支援分區的。

3、Range分區
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)
);

在這個例子中, 店內工人相關的所有行將保存在分區p0中,辦公室和支援人員相關的所有行保存在分區p1中,管理層相關的所有行保存在分區p2中。

查看分區

show create table employees;


4、List分區

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

LIST分區是透過使用"PARTITION BY LIST(expr)"來實現,其中"expr"是某列值或一個基於某一個列值、並傳回一個整數值的表達式,然後透過"VALUES IN (value_list)"的方式來定義每個分區,其中"value_list"是一個透過逗號分隔的整數列表。

create table category_part( cid int unsigned not null auto_increment,cname varchar(64) not null,parent_id int not null,primary key (cid,parent_id))
partition by list(parent_id)(
partition p1 values in (1,2,3,6,9),
partition p2 values in (4,5,10,22,23),
partition p3 values in (7,8,11,12,13),
partition p4 values in (14,15,16,17,20),
partition p5 values in (18,19,21,24,25)
);

5、HASH分區

hash分區的目的是將資料均勻的分佈到預先定義的各個分區中,保證各分區的資料數量大致一致。在RANGE和LIST分區中,必須明確指定一個給定的列值或列值集合應該保存在哪個分區中;而在HASH分區中,MYSQL自動完成這些工作,用戶所要做的只是基於將要被散列的列值指定一個列值或表達式,以及指定唄分區的表將要分割成的分區數量。

要使用HAHS分割區來分割一個表,要在CREATE TABLE語句上新增一個PARTITION BY HASH(expr)子句,其中「expr」是傳回一個整數的表達式。 expr可以只是欄位類型為整數的列名。此外,使用者很可能需要在後面再增加一個PARTITITIONS num子句,其中num是非負的整數,它表示將要被分割成分區的數量。如果沒有包含一個PARTITIONS子句,分割區數量預設為1.

create table t_hash (
a int,
b datetime)
partition by hash (YEAR(b))
partitions 4;

LINEAR HASH分割區的優點在於增加、刪除、合併和分割分割區將變得更加快捷,有利於處理含有大量資料的表。缺點在於,與使用HASH分區得到的資料分佈相比,各分區間資料的分佈可能不大均衡。

6、keys分區

create table orders_key
(
id int auto_increment,
customer_surname varchar(30),
store_id int,
alesperson_id int,
order_Date date,
note varcahr(500),
index_idx(id)
) engine=myisam partition by key(order_date) partitions 4;

這個分區類似於hash分區,除了MySQL伺服器使用它本身的hash表達式,不像其他類型的分區,不必要求使用一個int或null的表達式。

 以上就是MySQL高級十五-表格的分區的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn