高效?存储用户上传的文件名不是在数据库中,而是在目录结构和SSD中



我正在开发一个网站,我正在处理用户的上传,如下所示:

每个用户都有一个唯一的密钥,比如说一个用户有一个密钥"aaabbbccc"。现在我保存这个用户上传到目录树像这样的aaa/bbb/ccc/<timestamp>.fileextension

当我想看看用户上传了什么时,我会在用户对应的目录中这样做

if (is_dir($dir))
{
if ($dh = opendir($dir))
{
$inc = 0;
while (($file = readdir($dh)) !== false)
{
if (!is_dir($dir.$file))
{
$user_files[$inc]=$file;
$inc++;
}
}
closedir($dh);
}
}

我担心的是:这样获取上传的用户列表是否有效,或者如果我将每个上传文件存储在这样的数据库中会更快:

upload_id, upload_filename, user_owner_id

(在user_owner_id处有索引)然后只有SELECT * FROM uploads WHERE user_owner_id = 1

主要问题:什么会更快

此外,在将用户上传的文件名存储在目录结构中的情况下,我是否必须担心大量的磁盘读取请求(我听说SSD的使用寿命很短)-我怀疑这种担忧是否有任何实际影响,但我很想得到一个仅用于教育目的的答案:)

虽然我不应该太关心这一切,因为网站流量不高,但我对你的答案很好奇,因为我不知道这两种方法中哪一种被认为是更好的方法:)

一些注意事项(我不是SSD和DB的专家,我只知道如何使用它们):

第一:

  1. 更快是主观的,所以ymmv,所以对于你的情况来说,更快的就是最快的。基准测试总是一个好主意,因为在你尝试之前,没有人能告诉你解决方案是否对你更好
  2. DB非常擅长快速高效地查找和排序大型数据集
  3. 应考虑代码的可维护性和灵活性。如果使用DB会增加额外的好处,那么就使用它
  4. 为了安全起见,你可能想隐藏上传的文件并混淆文件名,并且只向登录用户提供文件,那么你需要一个数据库,因为它更容易实现
  5. 如果在站点流量较低的情况下,每个目录只有几百个文件,那么数据库可能会被高估。此外,如果您有数以万计的文件,将它们放在一个目录中要比将它们分离到多个目录慢
  6. 使用数据库意味着您需要将文件名同步到数据库,而只使用文件系统则不需要关心这一点

秒:

  1. SSD由各种技术制成,如非易失性NAND闪存或DRAM(需要恒定电源,因此易失性)
  2. 使用较慢的基于闪存的SSD,您还可以使用MLC或更持久的SLC
  3. 一般来说,SSD的寿命大约是写寿命(实际上是单元的擦除极限),大约是10000次操作(或5000次,取决于固件版本)
  4. 一旦SSD寿命结束(运行状况为0%),它将保持只读状态,但硬件控制器或软件将在电池丢失数据之前很久发生故障
  5. 如果您的数据很重要,请对驱动器进行RAID。在驱动器出现故障之前将其换出将有助于控制峰值性能。当健康状况在10-15%左右时,建议换掉

您需要权衡您的选择。对于少量的文件和低流量,数据库可能会更慢,或者只是增加复杂性。

有了成千上万的文件、安全性,再加上更多的流量等等,DB将是不可或缺的IMO.

希望这能有所帮助:)

相关内容

  • 没有找到相关文章

最新更新