04 表的拆分优化

Yishto 2018-03-22 19:49:12
Categories: Tags:

1. 表的垂直拆分

所谓的垂直拆分 , 就是把原来一个有很多列的表拆分成多个表 , 这解决了表的宽度问题 , 通常垂直拆分可以按以下原则进行 :
1 . 把不常用的字段单独存放到一个表中 .
2 .把大字段独立存放到一个表中 .
3 . 把经常一起使用的字段放到一起 .
将表结构如下的表进行拆分 :

1
2
3
4
5
6
7
8
9
10
CREATE TABLE 'film'(
'film_id' smallint(5) unsigned not null auto_increment ,
'title' varchar(225) not null ,
'description' TEXT ,
'release_year' year(4) default null ,
'language_id' tinyint(3) unsigned not null ,
'original_language_id' tinyint(3) unsigned not null ,
'created-at' timestamp ,
'updated_at' timestamp
)engine=innodb default charset=utf8

这里的 title 和 description 字段较大 , 可以将这两个字段取出来单独放在一个表里 , 利用 film_id 作外键 .

1
2
3
4
5
6
CREATE TABLE file_text(
'film_id' smallint(5) unsigned not null ,
'title' varchar(255) not null ,
'description' TEXT
primary key(film_id)
)engine=innodb;

2. 表的水平拆分

表的水平拆分是为了解决单表数据量过大的问题 , 水平拆分的表每一个表的结构都是完全一致的 . 以下面的 payment 表为例 :

1
2
3
4
5
6
7
8
9
CREATE TABLE 'PAYMENT'(
'payment_id' smallint(5) unsigned not null auto_increment ,
'customer_id' smallint(5) unsigned not null ,
'staff_id' tinyint(3) unsigned not null ,
'rental_id' int(11) default null ,
'amount' decimal(5,2) not null ,
'last_update' timestamp ,
primary key('payment_id')
)engine=innodb default charset=utf8;

常用的拆分方法为 :
1 . 对customer_id 进行 hash 运算 , 如果要拆分成 5 个表则使用 mod(customer_id,5)取出0-4个值
2 . 针对不同 hashID 把数据存到不同的表中 .