当LAMP服务器上有数百万用户时,什么是最快和最有效的存储和提取图像的方式?

这是迄今为止我提出的最好的方法,我想知道是否有一个更好的方法(我确定有!)来存储和获取数以百万计的用户图像

为了保持目录的大小,并避免对数据库进行任何额外的调用,我使用基于用户的唯一ID计算的嵌套目录如下:

$firstDir = './images'; $secondDir = floor($userID / 100000); $thirdDir = floor(substr($id, -5, 5) / 100); $fourthDir = $userID; $imgLocation = "$firstDir/$secondDir/$thirdDir/$fourthDir/1.jpg"; 

用户ID( $userID )的范围从1到数百万。

所以,如果我有用户ID 7654321 ,例如,该用户的第一张照片将被存储在:

 ./images/76/543/7654321/1.jpg 

对于用户ID 654321

 ./images/6/543/654321/1.jpg 

对于用户ID 54321 ,它将是:

 ./images/0/543/54321/1.jpg 

对于用户ID 4321 ,它将是:

 ./images/0/43/4321/1.jpg 

对于用户ID 321 ,它将是:

 ./images/0/3/321/1.jpg 

对于用户ID 21 ,它将是:

 ./images/0/0/21/1.jpg 

对于用户ID 1 ,它将是:

 ./images/0/0/1/1.jpg 

这确保了用户高达100,000,000,我永远不会有一个目录超过1000个子目录,所以它似乎保持干净和高效。

我对这种方法进行了基准testing,以避免使用以下使用PHP(crc32)中最快哈希方法的“哈希”方法。 这个“散列”方法将第二个目录计算为用户ID和第三个目录的散列中的前3个字符作为下一个3个字符,以随机但均匀地分配文件,如下所示:

 $hash = crc32($userID); $firstDir = './images'; $secondDir = substr($hash,0,3); $thirdDir = substr($hash,3,3); $fourthDir = $userID; $imgLocation = "$firstDir/$secondDir/$thirdDir/$fourthDir/1.jpg"; 

然而,这个“散列”方法比我之前描述的方法慢,所以不好。

然后我再往前走了一步,发现在我原来的例子( floor(substr($userID, -5, 5) / 100); )中计算第三个目录的方法更快,如下所示:

 $thirdDir = floor(substr($userID, -5, 3)); 

现在,这改变了最初的10,000个用户ID的存储方式,使第三个目录有一个用户子目录或者111个而不是100个,但是由于我们不需要用100除以100,所以我认为从长远来看是值得的。

一旦定义了目录结构,下面是我如何计划存储实际的单个图像:例如,如果用户上传第二张图片,它将与第一张图片位于相同的目录中,但是它将被命名为2.jpg 。 用户的默认图片总是只有1.jpg ,所以如果他们决定将第二张图片设为默认图片, 2.jpg将被重命名为1.jpg1.jpg将被重命名为2.jpg

最后但并非最不重要的是,如果我需要存储多个相同图像的大小,我将它们存储为用户ID 1(例如)如下:

1,024像素:

 ./images/0/0/1/1024/1.jpg ./images/0/0/1/1024/2.jpg 

640像素:

 ./images/0/0/1/640/1.jpg ./images/0/0/1/640/2.jpg 

就是这样。

那么,这种方法有什么缺点吗? 如果是这样的话,请把它们指出来?

有更好的方法吗? 如果是这样,请您描述一下吗?

在我开始实施这个之前,我想确保我有最好,最快,最有效的方法来存储和检索图像,以便我不必再次更改。

谢谢!

Solutions Collecting From Web of "当LAMP服务器上有数百万用户时,什么是最快和最有效的存储和提取图像的方式?"

不要在乎计算路径的小速度差异,没关系。 重要的是图像在目录中的分布有多好,一致,路径的产生有多短,推导命名约定是多么困难(让1.jpg替换成2.jpg ..哇,它正在工作..) 。

例如,在散列解决方案中,路径完全基于用户标识,这将把属于一个用户的所有图片放到同一个目录中。

使用整个字母表(大写和小写,如果你的FS支持的话),而不仅仅是数字。 检查什么其他软件做的,一个好地方检查哈希直接的名字是谷歌浏览器,mozilla,…最好有短的目录名称。 查找速度更快,在html文档中占用的空间更少。