mysql分區理論

查看mysql安裝的引擎
mysql>show engines;
查看mysql安裝的插件(這裏用於查看當前mysql是否支持partition)
mysql>show plugins;
不一樣分區對比
分區類型 優勢 缺點 共性
Range 適合與日期類型,支持複合分區 有限的分區 通常只針對某一列
List 適合與有固定取值的列,支持複合分區 有限的分區,插入記錄在這一列的值不在List中,則數據丟失 通常只針對某一列
Hash 線性Hash使得增長、刪除和合並更快捷 線性Hash的數據分佈不均勻,而通常Hash的數據分佈較均勻 通常只針對某一列
Key 列能夠爲字符型等其餘非Int類型 效率較以前低,由於函數複製的程度,(如。MD5或SHA函數) 通常只針對某一列php

海量數據優化2種方法
一、大表拆小表,分表、分區,物理的操做
二、sql語句的優化,經過增長索引來調整,可是數據量增大將會致使索引的維護代價增大,邏輯層面提高mysql

大表拆小表
垂直分表,拆列字段,缺點:破壞表關係,表關聯
水平分表,拆數據行,缺點:php代碼量維護,邏輯層面困難增長算法

mysql分區
有點相似水平分表,可是它是基於邏輯層面,而不是物理層面,對於程序而言分區表仍是一張表
mysql5.1的4種分區類型
range分區:基於屬於一個給點連續區間的列值,把多行分配給分區
list分區:相似按range分區,區別在於list分區是基於列值匹配一個離散值集合中的某個值來進行選擇,列值是固定值的時候,例如枚舉的時候
hash分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算,這個函數能夠包含mysql中有效的,產生非負整數值得任何表達式,測試使用
key分區:相似按hash分區,區別在於key分區只支持計算一列或多列,且mysql服務器提供自身的哈希函數sql

range分區sql
create table emp(服務器

int 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 商店IDless

)--根據商店ID時間來設置分區
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),測試

)優化

===========插件

create table emp(

int 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(YEAR(separated))(

partition p0 values less than (1991),
partition p1 values less than (1996),
partition p2 values less than (2001),
partition p3 values less than MAXVALUE,

)

emp.frm 表結構
emp.par 分區表(分了4個分區,每個分區有一個分區數據文件和一個分區索引文件)
emp.#P#p0.MYD MYData分區數據文件
emp.#P#p0.MYI MYIndex分區索引文件
emp.#P#p1.MYD
emp.#P#p1.MYI
emp.#P#p2.MYD
emp.#P#p2.MYI
emp.#P#p3.MYD
emp.#P#p3.MYI

list分區sql
create table emp(

int 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 商店ID

)--根據商店ID時間來設置分區,枚舉類型,固定的值
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 pCenter values l in (7,8,15,16)

)

emp.frm 表結構
emp.par 分區表(分了4個分區,每個分區有一個分區數據文件和一個分區索引文件)
emp.#P#pCenteral.MYData分區數據文件
emp.#P#pCenteral.MYI MYIndex分區索引文件
emp.#P#pEast.MYD
emp.#P#pEast.MYI
emp.#P#North.MYD
emp.#P#North.MYI
emp.#P#pWest.MYD
emp.#P#pWest.MYI

hash分區sql
create table emp(

int 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 商店ID

)--根據入職時間分區,入職時間不一樣, hash算法平均分配到不一樣的分區內
partition by hash(YEAH(hired))
partitions 4;

key分區 與hash分區相似,但它的key能夠不是整數,如能夠是字符串類型,mysql簇(Cluster)使用函數MD5(來)實現key分區;對於使用其餘存儲引擎的表,服務器使用其本身內部的哈希函數,這些函數與password()同樣的運算法則

相關文章
相關標籤/搜索