首页 > 技术分享 > MySQL
收藏

MySQL优化 - 垂直分割

07/08 16:06
大潇博客 原创文章,转载请标明出处

有些表记录并不多,可能也就两三万条,但是个别字段却很长,表占用空间很大,检索表时需要执行大量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做主键


打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311