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条)

报告相同问题?

悬赏问题

  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形