php分区表,【MYSQL】分区表
對于MYSQL的態(tài)度一直都是會基本SQL和簡單命令就行,最近處理一個數(shù)據(jù)量很大的項目,為了提高效率,在數(shù)據(jù)庫方面的瓶頸上,選擇了使用分區(qū)表來提高查詢效率。至此和大家一起分享一下。 1.引言 本文初略的講述了mysql數(shù)據(jù)庫如何分區(qū)表。 2.環(huán)境要求 在5.1版本
對于MYSQL的態(tài)度一直都是會基本SQL和簡單命令就行,最近處理一個數(shù)據(jù)量很大的項目,為了提高效率,在數(shù)據(jù)庫方面的瓶頸上,選擇了使用分區(qū)表來提高查詢效率。至此和大家一起分享一下。
1.引言
本文初略的講述了mysql數(shù)據(jù)庫如何分區(qū)表。
2.環(huán)境要求
在5.1版本中不是默認就安裝了,而在之后版本中一般默認選擇了安裝分區(qū)表支持。可以通過如下方式查看當前數(shù)據(jù)庫是否支持分區(qū)表操作:
使用show variables like '%partition%';如果不支持分區(qū),那么value字段值為No。
3.重要概念描述
3.1 分區(qū)字段
1)當僅存在單一主鍵時,不存在唯一鍵,那么分區(qū)字段必須是主鍵字段;
2)當存在復合主鍵時,不存在唯一鍵,那么分區(qū)字段必須是主鍵組合的一部分字段,一個或多個。
3)當主鍵和唯一鍵都存在時,那么分區(qū)字段必須同時包括主鍵字段和唯一鍵字段。
4.分區(qū)表類型
4.1 range分區(qū)
1)語法展示:# 語法
# 在創(chuàng)建表單的最后,添加partitions by range(分區(qū)字段)(
# partition 分區(qū)名 values less than(閥值1),
# partition 分區(qū)名 values less than(閥值2),
# ...
# partition 分區(qū)名 values less than(閥值n),
# )
示例展示:create table test_range(
id int auto_increment,
description varchar(50),
primary key(id)
) ENGINE=InnoDB auto_increment=1 default charset=utf8
partition by range(id)(
partition p1 values less than(6), #id<6的存放在p1分區(qū)
partition p2 values less than(11) #6 <= id < 11 存放在p2分區(qū)
);
查看分區(qū)情況:show create table test_range;
注意到,在顯示的表結(jié)構(gòu)添加了分區(qū)表的信息。
數(shù)據(jù)測試:insert into test_range values(null, "test1");
insert into test_range values(null, "test2");
insert into test_range values(null, "test3");
insert into test_range values(null, "test4");
insert into test_range values(null, "test5");
insert into test_range values(null, "test6");
insert into test_range values(null, "test7");
insert into test_range values(null, "test8");
insert into test_range values(null, "test9");
insert into test_range values(null, "test10");
插入10條數(shù)據(jù),此時我們來查看其查詢執(zhí)行過程:
從結(jié)果可以發(fā)現(xiàn),其只是在p1分區(qū)執(zhí)行的查詢,那么此時就減少了查詢掃描的數(shù)據(jù)量,從而提高了查詢效率。
如果此時,我們插入第11條數(shù)據(jù)會發(fā)生什么情況呢?insert into test_range values(null, "test11");
會發(fā)錯:insert into test_range values(null, "test11")Error Code: 1526. Table has no partition for value 110.015 sec
原因很簡單,因為在我們創(chuàng)建表單時,僅僅指定了1 - 10的id數(shù)值分區(qū),當插入id=11時的分區(qū)時,此時沒有分區(qū)提供,那么就引發(fā)錯誤,那么如果解決這樣的問題呢,采取如下方式,修改表的分區(qū)方式:alter table test_range add partition(
partition p3 values less than(MAXVALUE)
);
# 添加一個分區(qū),也就是p3是id從11到maxValue的存放區(qū)域
此時插入id=11的數(shù)據(jù),并執(zhí)行查詢解析:
發(fā)現(xiàn),已經(jīng)將其分配到p3分區(qū)中了。
還需要特別注意的時,使用partition by range(分區(qū)字段),其中的分區(qū)字段可以是分區(qū)字段的表單式,但是必須是返回的整數(shù),在5.5版本中,可以使用partition by range column/columns語法,指定某個字段。這里不做介紹。大家可以自己嘗試一下。
4.2 list分區(qū)
list分區(qū)可以理解為集合分區(qū)方式,意思就是指定某個集合來分區(qū)。
語法展示:partition by list(分區(qū)字段表達式)(
partition 分區(qū)名 values in(value1, value2,...,valuen)#分區(qū)集合
);
示例展示:create table test_list(
id int auto_increment,
description varchar(50),
primary key(id)
)ENGINE=InnoDB auto_increment=1 default charset=utf8
partition by list(id)(
partition p1 values in (1, 3, 5, 7, 9),#id=1,3,5,7,9分配至p1區(qū)
partition p2 values in (2, 4, 6, 8, 10)#id=2,4,6,8,10分配至p2區(qū)
);
#可以如4.1中使用show create table test_list查看表創(chuàng)建結(jié)構(gòu)。
數(shù)據(jù)測試:使用4.1中數(shù)據(jù)測試sql,插入10條數(shù)據(jù)。
可以發(fā)現(xiàn)其查詢的僅僅是p1區(qū)。如果需要添加分區(qū),可以使用4.1中使用的add partition來添加分區(qū)。
4.3 hash分區(qū)
使用hash函數(shù)得到取模,分配到不同的分區(qū)中。分區(qū)表達式必須返回整數(shù)。
語法展示:partition by hash(分區(qū)表達式) partitions 表數(shù)量(模數(shù)).
示例展示:create table test_hash(
id int auto_increment,
description varchar(50),
primary key(id)
) ENGINE=InnoDB auto_increment=1 default charset=utf8
partition by hash(id) partitions 3; #以id分區(qū),分配到3張表中
數(shù)據(jù)測試:插入4.1類同10條數(shù)據(jù)
你也可以嘗試修改id值,查看其分配的分區(qū)。hash分區(qū)還有一種叫做linear hash線性分區(qū),這里不做介紹,
4.4 key分區(qū)
在本次開發(fā)中,我選擇的是key分區(qū),因為其是針對一個或多個字段作為分區(qū)字段,不要求是正整數(shù),其內(nèi)部調(diào)用的是自己的hash函數(shù),計算出hash整數(shù)值,然后取模分表。
語法展示:partition by key(分區(qū)字段組合) partitions 表數(shù)(模數(shù))。
操作和Hash分區(qū)一致,這里就不做累贅的展示了。
5.額外擴展
5.1 在實際開發(fā)中,經(jīng)常出現(xiàn)的情況是表已經(jīng)上線使用,那么必須動態(tài)添加分區(qū)類型。alter table 表名 partition by hash/key (分區(qū)字段表達式) [partitions 表數(shù)]#如果不加partitions那么默認為1.
alter table 表名 partition by range/list(分區(qū)字段表達式)(具體分區(qū)設(shè)置)。
5.2 當發(fā)現(xiàn)之前的分區(qū)需要添加新的分區(qū)時,采取如下方式:list/range : alter table 表名 add partition (partition 分區(qū)名 [values in|values less than] [集合|數(shù)值]);
hash/key : alter table 表名 add partition partitions 表數(shù);
例如:修改上述test_hash的分區(qū)數(shù)量alter table test_hash add partition partitions 6;
5.3 刪除某個分區(qū)/刪除所有分區(qū)# 刪除某個分區(qū)
list/range : alter table 表名 drop partition 分區(qū)名1, 分區(qū)名2,...;
#例如:
alter table test_list drop partition p1;
hash/key : 上述語法不成立
# 刪除整個分區(qū)
alter table test_hash remove partitioning;
還有諸如合并分區(qū),以及5.5的一些新特性,list/range 增加column,columns支持。本文不做過多闡述。
本文原創(chuàng)發(fā)布php中文網(wǎng),轉(zhuǎn)載請注明出處,感謝您的尊重!
總結(jié)
以上是生活随笔為你收集整理的php分区表,【MYSQL】分区表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技能的反面 - 魔方和模仿
- 下一篇: viewpager 自定义翻页效果_An