表分区 partition 当一张表的数据非常多的时候,比如单个.myd文件都达到10G, 这时,必然读取起来效率降低. 可不可以把表的数据分开在几张表上? 1: 从业务角度可以解决.. (分表,水平分割),比如, 通过id%10 , user0 , user1....user9, 这10张表 根据不同的余数,来插入或查询某张表. 2: 通过mysql的分区功能,而不是通过代码来控制,再建表的时候指定分区的规则,mysql将会根据指定的规则,把数据放在不同的表文件上,相当于在文件上,被拆成了小块.但是,给客户的界面,还是1张表.对用户来说是透明的。 常用的规则:一般是根据某列的范围来分区, 也可以某列的散点值来分区. 示例: 按列的范围来分区 以用户表为例, uid uid [1,100万) ---> user partition u0 放在第一张表里 uid[100万, 200万) ---> user partition u1 放在第二张表里 uid [200万, MAX] --> user partion u2 放在第三张表里
分区 按range范围分区,根据id的范围来分区, create table goods ( id int, uname char(10) )engine myisam partition by range(id) ( partition p1 values less than (10), //id小于10的在一个区域 partition p2 values less than (20), //id小于20的在一个区域 partition p3 values less than MAXVALUE //其他在p3 );
按散点值分区 有一张省表 create table area( aid int, zone char(10) )engine myisam; insert into area values (1,’bj’),(2,’ah’),(3,’xb’);
pid 主键 |
prov 省名 |
1 |
北京 |
2 |
安徽 |
... |
|
35 |
西藏 |
user 表,按省来拆分,
uid 主键 |
pid 省份 |
uname 用户名 |
1 |
1 |
张北京 |
15 |
2 |
赵安徽 |
create table user ( uid int, aid int, uname char(10) )engine myisam partition by list(aid) ( partition bj values in (1), partition ah values in (2), partition xb values in (4,5,6) ); //7是没有的区,会报错。 insert into user values (1,1,’11’),(2,2,’22’),(3,4,’44’),(4,5,’55’),(5,6,’66’),(6,7,’77’);
注意: 在使用分区的时候,注意,分区的那个列,值不要为NULL (如果不小心为NULL,mysql为理解为0,尽量执行之) 注 :分区甚至可以按照表达式的返回值,计算所属区. 但用表达式,不如直接用值来得快. 根据情况而定. 比如,用 partition by range (year(regtime)) 可以按注册年份来分区.