如果我将详细信息行合并到标头表中的单个列中,它会更快吗?

时间:2012-12-07 22:13:46

标签: php mysql optimization explode

所以我在相册中组织了一个图库画廊网站 db表存储相册的图像,基本上有这个方案:

album_id | images_link
112      | 1.jpg
112      | 2.jpg
112      | 3.jpg
112      | 4.jpg
112      | 5.jpg
112      | 6.jpg
112      | 7.jpg
112      | 8.jpg
112      | 9.jpg

因此,为了避免使用超长数据库表,我想可能会将相册的所有图像存储到单个单元格中,如下所示:

album_id | images_link
112      | 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg, 6.jpg, 7.jpg, 8.jpg, 9.jpg

我的意思是数据库大小当然会保持不变,但会有很大的差异 减少要读取的行数。 我将使用explode函数来分割和提供每个图像文件链接。这是 明智的选择?我不确定爆炸功能是否像读取内存一样饥饿 大型数据库。我想听听你的意见。

看问题是图像名称不是那么短,images_link行设置为27个字符 因此,我设置的每张专辑限制为30张图片,因此预计会有一个单元格 到达810chars以后。我从来没有使用varchar存储那么多的字节,是 在这种情况下使用VARCHAR还是TEXT更好?我知道VARCHAR更快。

提前谢谢。

3 个答案:

答案 0 :(得分:3)

你的第一个方案比第二个好。

更适合维护:

  • 仅添加一行以放置新图片
  • 仅删除行以退出图像
  • 如果您想编辑图像的路径,您只需要更新 那一排......

以后如果你想用第一张图片列出galery,你只需要加入......

使用第二个模式,在类别表中有一个名为“list_of_images”的字段没有区别......

答案 1 :(得分:2)

不,不要那样做。拥有“超长数据库表”没有问题。将子项聚合到单个列中存在许多潜在问题。

你说“要读取的行数要少得多。”你是否想象如果你不使用细节表会有某种速度提升,你把所有东西都塞进标题表?没有。

你现在拥有它的方式就是它应该完成的方式。保持这种状态并继续学习。

答案 2 :(得分:0)

您应该保留原始表结构,因为维护images_link列将成为一场噩梦。当你想删除album_id = 112和images_link = 3.jpg的行时会发生什么?

如果要将读取简化为单行,请尝试使用group_concat

进行查询
SELECT GROUP_CONCAT(images_link) FROM tbl_album_images WHERE album_id='112'

应返回

1.jpg,2.jpg,3.jpg,4.jpg,5.jpg,6.jpg,7.jpg,8.jpg,9.jpg
编辑:我确定这很明显,但也要确保你有关于album_id的索引