mysql按照省市给表分区_表分区-partition

partition分区:

设置分区限制,t0:1-10,t1:10-20,t2:20-最大值:

773d66c4e07c017de3f019e43dd40e6a.png

插入数据后可以看到topic表出现了t0、t1、t2:

2958065b483b5e82d71c83f435e74e3a.png

按照散点值分区:

创建地区表:

325916e8f5a3fd40aecc0c7b7dad99fb.png

建立会员表,根据所在地区拆分:

4ca74bb6f8c08e724e10b2a14c7c6fc2.png

插入数据:

29e87cd1b49baee4b0a5d6f30ef6a030.png

然后查看表,明显bj、hb有不为空,xs为空:

7e2dd6f7609931a20456d1ed0d8258a3.png

但是,你要是插入地区为9的数据,因为没有这个地区的分区,会报错:

916269b9eff27f3abebb5ed9fb7def80.png

当然,还可以按年月日等的分区,但需要函数调用,不如直接按值来的快

表分区partition

当一张表的数据非常多的时候,比如单个.myd文件都达到10G,这时,必然读取起来效率降低.

可不可以把表的数据分开在几张表上?

1: 从业务角度可以解决. (分表)

比如, 通过id%10 , user0 , user1....user9,这10张表

根据不同的余数,来插入或查询某张表.

2: 通过mysql的分区功能

mysql将会根据指定的规则,把数据放在不同的表文件上.

相当于在文件上,被拆成了小块.

但是,给客户的界面,还是1张表.

常用的规则:

根据某列的范围来分区, 也可以某列的散点值来分区.

示例: 按列的范围来分区

以用户表为例, uid

uid [1,10)  ---> user partition u0

uid[10, 20) ---> user partition u1

uid [20, MAX] --> user partion u2

分区按range分区

create table goods (

id int,

uname char(10)

)engine myisam

partition by range(id) (

partition p1 values less than (10),

partition p2 values less than (20),

partition p3 values less than MAXVALUE

);

按散点值分区

有一张省表pid 主键prov 省名

1北京

2安徽

...

35西藏

user 表,想按省来分区,uid 主键pid 省份uname 用户名

11张北京

152赵安徽

create table user (

uid int,

pid int,

uname

)engine myisam

partition by list(pid) (

partition bj values in (1),

partition ah values in (2),

partition xb values in (4,5,6)

);

注意: 在使用分区的时候,注意,分区的那个列,值不要为NULL

(如果不小心为NULL,mysql为理解为0,尽量执行之)

注 :分区甚至可以按照表达式的返回值,计算所属区.

但用表达式,不如直接用值来得快.根据情况而定.

比如,用partition by range (year(regtime))可以按注册年份来分区.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值