设计成一对一关系的数据表属于"数据表垂直切分", 主要优点是更新/插入是可以减小锁表时间, 查询时可以减小读取的数据量. 如果把两个表文件保存在不同的硬盘上, 那么查询的性能可以更高.
当然,如果数据切分得不合理, 性能反而更差.
为什么要用一对一的关系, 直接放在一张表里不好吗? 这样只操作一张表, 很好维护.
一对一的关系有什么好处?难道是把大字段单独存可以提高查询性能吗?
CREATE TABLE jforum_posts ( post_id INT NOT NULL auto_increment, topic_id INT NOT NULL default '0', forum_id INT NOT NULL default '0', user_id INT NOT NULL default '0', post_time datetime default NULL, poster_ip varchar(15) default NULL, enable_bbcode tinyint(1) NOT NULL default '1', enable_html tinyint(1) NOT NULL default '1', enable_smilies tinyint(1) NOT NULL default '1', enable_sig tinyint(1) NOT NULL default '1', post_edit_time datetime default NULL, post_edit_count INT NOT NULL default '0', status tinyint(1) default '1', attach TINYINT(1) DEFAULT '0', need_moderate TINYINT(1) DEFAULT '0', PRIMARY KEY (post_id), KEY (user_id), KEY (topic_id), KEY (forum_id), KEY(post_time), INDEX (need_moderate) ) TYPE=InnoDB; CREATE TABLE jforum_posts_text ( post_id INT NOT NULL PRIMARY KEY, post_text TEXT, post_subject VARCHAR(100) ) TYPE=InnoDB;
好处很多,简单说几个:
1、第一张的表结构,在IO存储的时候,每行数据都是等长的,这个表的设计真的花了心思了。唯独:poster_ip varchar(15),其实ip也可以用整型。
2、第二张表第一个特点,post_id不是自增的,自增主键是要靠锁表产生新的主键值的。所以,这个表不存在这个自增约束的问题。很早以前做过测试,有自增和无自增的条件下,插入速度会有很大的差别。但post_id其实可以做一个索引。
3、第一张表实际上是状态表,帖子的状态随时在变,第1、已经说了,由于其在IO存储时的特性,决定了这个表在读写方面有一定优势。
4、内容分离,这个大家都说了。内容分离还有好处,在做数据索引等外围操作的时候,速度会更好。内容分离其实对于审查等,也十分方便。不过内容分离造成了代码在逻辑上的复杂度。
MySql在百万级的时候,只要看配置和表优化良好,一般查写还不会有太大的问题(我试过用MyISAM做Session表,上千万了,就是查询会缓慢,不过还能插新session,当然,这时应该做得事情就是清空session表)。但他InnoDB,要用事务回滚,是为了防止关联操作时发生数据异常。MyISAM作为log应用,是非常强大的。InnoDB做第二张表,我还是会有些惊。其实可以加个last_modify字段,内容表是允许冗余的,只要通过检查last_modify就能拿出有效的数据了。日常管理,检查post_id出现冗余的字段进行清空即可了。这样第一张表操作开事务,第二张写入异常则食物回滚,不然就commit。
其实还是有可以优化的地方的,我喜欢将日期时间等都用整型处理,这样做表转移也会简易很多。当然,个人习惯。
以上内容来自互联网!