有些表记录并不多,可能也就两三万条,但是个别字段却很长,表占用空间很大,检索表时需要执行大量I/O,严重降低了性能,这时候需要把大的字段拆分到另一张表,并且该表与原表是一对一的关系。(垂直分割)
举例说明:
建两张表,一张试题表,一张答案表
试题表:
create table question(
id int primary key auto_increment, /*题号*/
content text NOT NULL /*题干*/
);
答题表:
create table answer(
id int primary key auto_increment,
student_id int NOT NULL, /*学号*/
question_id int NOT NULL, /*试题id*/
answer text NOT NULL, /*答案*/
grade varchar(64) NOT NULL /*成绩*/
);
插入数据:
insert into question(id,content) values(1,"请写一篇散文");
insert into answer(student_id,answer,grade) values('1','结果(假设这里有一万个字)...','30');
现在要查出1号学生第1题的成绩,但answer字段较大,对查询速度会有影响(select *查询更慢)
如果把answer单独的提出,放到另外一张表,则查询answer表时速度会快很多
垂直分割
把某个表的某些字段,这些字段,在查询时,并不是经常关心,但数据量很大,我们建议大家,可以把这些字段单独的放到另外一张表,从而提高效率
选择字段的原则一般是保小不保大,能用占用字节小的字段就不用大的字段。比如主键,建议使用自增类型,这样省空间,空间就是效率。
按4个字节和按32个字节定位一条记录,谁快谁慢太明显了。涉及到几张表做join时,效果就更明显了。
建议使用一个不含业务逻辑的id做主键
上一篇:MySQL优化 - 水平分割
下一篇:MySQL连表查询实用技巧