我正在开发一个网站,我正在处理用户的上传,如下所示:
每个用户都有一个唯一的密钥,比如说一个用户有一个密钥"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的专家,我只知道如何使用它们):
第一:
- 更快是主观的,所以ymmv,所以对于你的情况来说,更快的就是最快的。基准测试总是一个好主意,因为在你尝试之前,没有人能告诉你解决方案是否对你更好
- DB非常擅长快速高效地查找和排序大型数据集
- 应考虑代码的可维护性和灵活性。如果使用DB会增加额外的好处,那么就使用它
- 为了安全起见,你可能想隐藏上传的文件并混淆文件名,并且只向登录用户提供文件,那么你需要一个数据库,因为它更容易实现
- 如果在站点流量较低的情况下,每个目录只有几百个文件,那么数据库可能会被高估。此外,如果您有数以万计的文件,将它们放在一个目录中要比将它们分离到多个目录慢
- 使用数据库意味着您需要将文件名同步到数据库,而只使用文件系统则不需要关心这一点
秒:
- SSD由各种技术制成,如非易失性NAND闪存或DRAM(需要恒定电源,因此易失性)
- 使用较慢的基于闪存的SSD,您还可以使用MLC或更持久的SLC
- 一般来说,SSD的寿命大约是写寿命(实际上是单元的擦除极限),大约是10000次操作(或5000次,取决于固件版本)
- 一旦SSD寿命结束(运行状况为0%),它将保持只读状态,但硬件控制器或软件将在电池丢失数据之前很久发生故障
- 如果您的数据很重要,请对驱动器进行RAID。在驱动器出现故障之前将其换出将有助于控制峰值性能。当健康状况在10-15%左右时,建议换掉
您需要权衡您的选择。对于少量的文件和低流量,数据库可能会更慢,或者只是增加复杂性。
有了成千上万的文件、安全性,再加上更多的流量等等,DB将是不可或缺的IMO.
希望这能有所帮助:)