表的拆分分为横向拆分(记录的拆分)和纵向拆分(字段的拆分)。拆分表的目的:提高查询速度。
1.横向拆分
我们从一个案例去解释,情景是这样的:某某博客,有50W的博客量,有2w的用户,发现随着用户和博客数的增加,查询速度日渐下降,现在要对博客表blog与用户表user进行优化。
表结构如下:
复制代码
1 create table blog(
2 bid
3 title
4 content
5 pubtime
6 uid
7 ) 50万
8 create table user(
9 uid
10 username
11 password
12 nick
13 ......
) 2万
首先我们要决定根据哪个字段对记录进行拆分,查询决定了拆分,在这里我们根据uid字段对两个表进行拆分是比较合理的。
复制代码
1 博客表根据uid去拆分:
2 1-5000------blog_1
3 5001-10000-----blog_2
4 10001-15000----blog_3
5 15001-20000----blog_4
6 人员表根据uid 等分:
7 1-5000------user_1
8 5001-10000-----user_2
9 10001-15000----user_3
10 15001-20000----user_4
复制代码
查询某人的博客:
1 根据uid确认表名:
2 $num=ceil(12345/5000);
3 select uid,bid,title,pubtime from blog_$num where uid=12345;
2.纵向拆分:把活跃字段(常用)、惰性字段(不常用)分开。
案例:比如人员表,活跃字段像用户名、密码、昵称等,惰性字段像手机号、邮箱、性别等不经常使用和修改的字段。
一张完整的用户表可以拆分为两张表,如下:
复制代码
1 create table user(
2 uid int key auto_increment,
3 username char(20),
4 password char(32) not null,
5 nick char(10)
6 );
7 create table user_ext(
8 uid
9 regtime
10 name
11 email
12 qq
13 phone
14 sex
15 )
复制代码