多个小目录或一个大目录,文件名为php-mysql


Multiple Small Directories Or One Huge Directory with file naming php mysql

这是一个完全理论性的问题。

我有一个照片存储网站,在该网站上注册的用户可以上传照片。

问题

  • 哪种方法更快
  • 当我需要使用大量电脑和硬盘
  • 还有其他更好的方法吗

现在我想到了两种方法来完成这些事情。

上传到我的服务器的文件预计将是巨大的~>1亿

方法1

这两个CCD_ 1&/pictures/low/目录将包含用户上传的所有文件。

$newfilename  =  $user_id.time().$filename; //$filename = actual filename of uploaded file
$src = '/pictures/hd/'.$newfilename; //for hd pics

通过将其插入mysql

insert into pics(`user_id`,`src`)VALUES('$user_id','$newfilename')

方法2

这两个CCD_ 3&/pictures/low/目录将包含用户上传的文件的子目录。

这将创建许多名为user_id的子目录,用户正在将文件上传到服务器中

if (!is_dir('/pictures/hd/'.$user_id.'/')) {
   mkdir('/pictures/hd/'.$user_id.'/');         
 }
$newfilename  =  $user_id.'/'.$user_id.time().$filename; //$filename = actual filename of uploaded file
$src = '/pictures/hd/'.$newfilename; //for hd pics

通过将其插入mysql

insert into pics(`user_id`,`src`)VALUES('$user_id','$newfilename')

检索

检索图像时,我可以使用pics表的src列来获取文件名,并使用'/pictures/hd/'.$src_of_picstable浏览hd文件,使用'/pictures/low/'.$src_of_picstable

浏览lowq

回答问题的正确方法是测试它。

哪个更快取决于文件的数量和欠同步文件系统;ext3,4将非常愉快地处理单个目录中的大量文件(在HTree索引中管理的dentries-atr)。有些文件系统只使用简单的列表。其他人有不同的优化文件访问的方法。

扩展的第一个问题是如何跨多个磁盘管理文件集。仅仅在多个磁盘上扩展一个文件系统是个坏主意。如果你有很多目录,那么你可以有很多挂载点。但是,当你处理terrabytes的数据时,这并不能很好地工作。

然而,内容是独立于文件存储的索引,这意味着您现在为文件存储选择什么并不重要,因为您以后可以轻松地更改文件到位置的映射,而无需移动现有数据集。

我不建议使用单目录方法,原因有两个。首先,如果你计划有很多图像,你的目录会变得很大。手动搜索单个图像将花费更长的时间。当你调试一些ir测试新功能时,这将是必要的。

使用多个目录的第二个原因是,您可以对库的一部分进行较小的备份。如果你有一个非常大的图库(比如说几TB),单个硬盘可能不足以容纳所有这些。使用多个目录,您可以将每个目录安装在单独的硬盘驱动器上,这样可以处理几乎无限大小的图库。

我最喜欢的方法是YYYY/MM/类型的图像目录结构。这样你就可以通过逐月查看来发现你什么时候引入了一些bug。此外,您还可以在不复制冗余文件的情况下每月进行备份。还制作了所有画廊的季度快照,以防万一。

关于图像类型,我可能需要几种类型的图像,如原始图像、小缩略图、缩略图、普通图像等。这样我就可以交换图像类型并获得不同的图像大小。

至于你,我建议YYYY/MM/type-of-image/user_id方法,在那里你可以很容易地在一个地方找到所有用户上传的文件。