表分区 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 用户名 |
1 |
1 |
张北京 |
15 |
2 |
赵安徽 |
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)) 可以按注册年份来分区.