日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

php分区表,【MYSQL】分区表

發(fā)布時間:2024/7/23 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php分区表,【MYSQL】分区表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對于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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。