xujunPro 2009-06-26 14:52
浏览 145
已采纳

对robbin说的一个设计的一点疑问

首先申明,我对robbin是大大的崇拜,发这个帖子没有任何的其他目的
场景:我们项目中有一个文件上传表,我记得robbin曾经说过javaeye论坛有一个闪光的设计就是将每个帖子的大字段context单独放在一个表中,topic和context关联,这样可以提高性能,我记得有一个论点就是:数据库真正的压力在I/O的吞吐上,topic表这样变小了,在查询时性能会提升,当需要看topic内容的时候,再去context表中获取帖子的内容。
现在我在项目中也想将文件上传表采用这样的分离设计。但需要说服我们的项目领导。他提出,一张File表虽然同时存了FileContext字段,但在file列表查询的时候只要发送"select fileId,fileName from uploadFiles"这样的SQL,并没有查询FileCOntext这个大字段,所以不会带来性能影响。
我自己作了一个简单的测试,在表中insert了2000记录,每条File的FileContext都insert了一个5M的文件,在执行"select fileId,fileName from uploadFiles"好像真的没有变慢。
想请各位大牛指点一下!!!万分感谢,我数据库是SQLSERVER2005,hibernate是3.2.5。
问题补充:
刚才有朋友在留言板回答是为了防止 “select ×”之类的查询,但是我完全可以通过HQL只查询fileId和fileName啊。我想这不应该是robbin提倡这样设计的原因吧

  • 写回答

2条回答 默认 最新

  • iteye_9243 2009-06-27 07:11
    关注

    不太清楚robbin是不是真的发表过类似的观点,不过这确实是有一定道理的。但是你的思路偏了,因为开销并不是损失在取不取字段这个问题上。
    一般来说,如果一个表里的字段都是定长的(没有varchar、text等字段),那么数据库在读取一条记录的时候就会按照固定长度读取,一次索引读,一次数据读就可以了。如果一条记录是变长的,那数据库首先需要取得行长,然后才能取数据,这要浪费一次物理读。一般大字段的读取概率相对不高,而每一次不需要大字段的读取却要浪费一次物理读。
    当然,可能有一些数据库的实现原理不是这样的,那就没有这个问题了。这里是MySQL的MyISAM存储引擎的说明:http://dev.mysql.com/doc/refman/5.1/en/myisam-table-formats.html,请参考《13.5.3.1. Static (Fixed-Length) Table Characteristics》和《13.5.3.2. Dynamic Table Characteristics》。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面