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