Mysql 处理大量上传图像的最佳目录结构是什么?

Mysql 处理大量上传图像的最佳目录结构是什么?,mysql,image,directory-structure,Mysql,Image,Directory Structure,我正在创建一个网站,将需要为每个用户上传个人资料图片以及调整大小的版本。我将使用mysql存储图像的ID和其他信息。我从来都不想处理重新排列静态文件的问题,所以让我们假设这个网站有数千名用户。我想知道存储图像的最佳目录结构是什么 我以前见过几种提到的方法: 1) md5(image_id),则如果哈希为49f68a5c8493ec2c0bf489821c21fc3b,则结构将为/49/f6/8a/5c/84/93/ec/2c/0b/f4/89/82/1c/21/fc/3b.jpg(或..3b/f

我正在创建一个网站,将需要为每个用户上传个人资料图片以及调整大小的版本。我将使用mysql存储图像的ID和其他信息。我从来都不想处理重新排列静态文件的问题,所以让我们假设这个网站有数千名用户。我想知道存储图像的最佳目录结构是什么

我以前见过几种提到的方法:

1) md5(image_id),则如果哈希为49f68a5c8493ec2c0bf489821c21fc3b,则结构将为/49/f6/8a/5c/84/93/ec/2c/0b/f4/89/82/1c/21/fc/3b.jpg(或..3b/filename.jpg)。这种方式似乎可以处理很多内容,但可能会创建太多的目录。也许是这种方法的一种变体

2) /year/month/day/(可能是小时)/id.jpg


那么该怎么办呢?

我通常将密钥以如下格式存储在图像记录旁边的数据库中:

userid/md5(image_id)_time.ext

这很好,因为它可以防止人们在不做大量工作的情况下“窃取”你的整个收藏。此外,它还有助于命名冲突,以防您更新原始图片并希望将“旧”图片存储一段时间(在某些情况下这可能是有益的)。另外,您可以将其设置为永不过期,因为您将永远不会再次更新它。您可能需要定期进入并刷新“旧”文件,但这是另一个问题。

如果我将文件名作为id存储图像,我倾向于使用以下结构:

/0/1.jpg
/500/501.jpg
/1000/1001.jpg
/1500/1501.jpg

其想法是创建不超过500个图像的文件夹,并将基本文件夹编号作为起点。这不需要任何特殊的DB字段或散列,您可以选择多于或少于500个。

图像/md5的前两个字符(user\u id)/user\u id/*.jpg

这样,您就不会有包含数千个其他文件/目录的目录,并避免有太多嵌套的树

e、 g


在这样的唯一散列上向下钻取子索引是一个很好的解决方案,但是示例中的子索引数量太多了。每个两个字符的subdir可以支持256个条目,因此,如果您将有5000个用户,那么当只进行一个级别的深度时,每个subdir只能获得大约20个文件,这是完全合理的。两级deep将轻松处理数百万用户

此外,我不会将文件名剪切为散列中剩余的字符。对文件名使用完整的哈希,无论您的文件名有多深。如果您需要(例如)将文件移动到新的存储区,则文件将更易于管理。也就是说,不要这样做:

49/f68a5c8493ec2c0bf489821c21fc3b.jpg
这样做:

49/49f68a5c8493ec2c0bf489821c21fc3b.jpg

你说的这个图像是什么?使用php您觉得如何?
49/49f68a5c8493ec2c0bf489821c21fc3b.jpg