首先申明,我对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提倡这样设计的原因吧
对robbin说的一个设计的一点疑问
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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》。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥30 STM32 INMP441无法读取数据
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥500 把面具戴到人脸上,请大家贡献智慧
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
- ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
- ¥30 c#打开word开启修订并实时显示批注
- ¥15 如何解决ldsc的这条报错/index error
- ¥15 VS2022+WDK驱动开发环境