应用情境:
当一张表的数据非常多的时候,比如单个.myd文件都达到10G, 这时,必然读取起来效率降低.
可不可以把表的数据分开在几张表上?
1: 从业务角度可以解决. (分表)
比如, 通过id%10 , user0 , user1....user9, 这10张表
根据不同的余数,来插入或查询某张表.
2: 通过mysql的分区功能
mysql将会根据指定的规则,把数据放在不同的表文件上.
相当于在文件上,被拆成了小块.
注意:如果aid的值不在1-4之间,会报错,即mysql不知道该将记录分到哪个区
注意: 在使用分区的时候,注意,分区的那个列,值不要为NULL
(如果不小心为NULL,mysql为理解为0,尽量执行之)
注 :分区甚至可以按照表达式的返回值,计算所属区.
但用表达式,不如直接用值来得快. 根据情况而定.
比如,用 partition by range (year(regtime)) 可以按注册年份来分区.
当一张表的数据非常多的时候,比如单个.myd文件都达到10G, 这时,必然读取起来效率降低.
可不可以把表的数据分开在几张表上?
1: 从业务角度可以解决. (分表)
比如, 通过id%10 , user0 , user1....user9, 这10张表
根据不同的余数,来插入或查询某张表.
2: 通过mysql的分区功能
mysql将会根据指定的规则,把数据放在不同的表文件上.
相当于在文件上,被拆成了小块.
但是,给客户的界面,还是1张表.
按range分区:
create table topic (
tid int primary key auto_increment,
title char(20) not null default ''
)engine myisam charset utf8
partition by range(tid) (
partition t0 values less than(10),
partition t1 values less than(20),
partition t2 values less than(MAXVALUE)
);
测试新增的数据分别放到哪个分区下:
<span style="font-size:18px;">insert into topic values (1,'aa');
insert into topic values (11,'bb');</span>
查看mysql数据库存放目录下的数据表结构文件的大小:
当执行上面第一条sql语句时:
说明:
MYD后缀的表示存放mysql的数据
MYI后缀的表示存放mysql的索引
frm后缀的表示存放mysql的表结构
执行第一条语句后,数据就存放到分区0中
当执行第二条sql语句时:
数据存放到分区1中
按散点值分区:
<span style="font-size:18px;">CREATE TABLE area (aid INT, zone CHAR(10)) ENGINE myisam charset utf8;
INSERT INTO area
VALUES
(1, 'bj'),
(2, 'hb'),
(3, 'sx'),
(4, 'ah');
CREATE TABLE user (
uid INT NOT NULL,
uname VARCHAR(30),
aid INT NOT NULL
)
PARTITION BY LIST(aid) (
PARTITION bj VALUES IN (1),
PARTITION hb VALUES IN (2),
PARTITION sx VALUES IN (3),
PARTITION ah VALUES IN (4)
);</span>
<pre name="code" class="sql">在分区1和2插入数据:
insert into user (uname,aid) vaules ('poly',1);insert into user (uname,aid) vaules ('lily',2);
注意:如果aid的值不在1-4之间,会报错,即mysql不知道该将记录分到哪个区
分区的好处:
1.表是由mysql按逻辑来进行分区的,在物理层面上只能看到一张表,不需要人为的设置路由规则去访问分区表(降低了维护成本)
2.分层了多个分区,可以增加访问连接数,I/O数,可以在一定程度上降低了死锁的概率
注意: 在使用分区的时候,注意,分区的那个列,值不要为NULL
(如果不小心为NULL,mysql为理解为0,尽量执行之)
注 :分区甚至可以按照表达式的返回值,计算所属区.
但用表达式,不如直接用值来得快. 根据情况而定.
比如,用 partition by range (year(regtime)) 可以按注册年份来分区.
分区的好处:
1.表是由mysql按逻辑来进行分区的,在物理层面上只能看到一张表,不需要人为的设置路由规则去访问分区表(降低了维护成本)
2.分层了多个分区,可以增加访问连接数,I/O数,可以在一定程度上降低了表锁的概率