图像使用数据库与文件系统进行排序

时间:2011-10-29 00:29:09

标签: php javascript sql

我有多个图像存储在以下网址中:/uploads/hash/IMAGE001.jpg。使用jQuery UI的sortable(),我想要异步地排序和存储图像的顺序。

我想出了几种方法来做到这一点,我很好奇最好的方法是什么。

我可以为每个/hash/目录创建一个包含3列(ID,IMAGE_URL,IMAGE_INDEX)的SQL表,并在每种情况下更新表的_INDEX值。然后,我可以通过ORDER BY IMAGE_INDEX查询数据库来获取IMAGE_URL的排序列表。

我的另一个想法是用前面的0000命名文件(例如/uploads/hash/0000IMAGE001.jpg)。如果我在各种类型的PHP中重命名文件,我可以使用/hash/获取PHP中的opendir()图像目录而不需要SQL开销,然后在客户端或服务器端按文件名排序。

我是否会遇到大量并发文件重命名(vs并发SQL表更新)的任何瓶颈问题?从PHP获取目录列表的性能与使用ORDER BY查询SQL有何不同?

3 个答案:

答案 0 :(得分:3)

在这种情况下,您应该使用数据库进行排序,

  1. 数据库将构建B树索引并保持排序以便快速检索和更新。
  2. 您可以对文件进行范围查询。
  3. 您可以更改实际文件的存储空间,而无需与查找相关联。
  4. 您可以使用memcachd和多台计算机上的分片扩展到大量图像
  5. 文件系统未设计用于排序和管理变更。

    1. 虽然文件数量很少时速度很快,但排序时间会越来越长。
    2. 图像本身与id密切相关,这限制了灵活性。
    3. 将您限制在一台计算机,一个目录以及操作系统限制中,您必须通过构建越来越多的程序来扩展,最终构建自己的伪数据库。
    4. 在服务器上,这将是地狱般的,操作系统锁定和并发管理并不像数据库那么复杂。
    5. 使用数据库是任何“真实”应用程序的方法,使用文件系统是一个快速的黑客。

答案 1 :(得分:0)

数据库经过精心设计和优化,可用于存储和检索数据。更改文件名以存储数据(如排序顺序)通常不是理想的选择。根据文件系统的不同,性能会有很大差异,故障也是灾难性的。绝对在这里使用数据库选项。

答案 2 :(得分:0)

如果您要使用PHP opendir()获取文件列表,可以使用一些技巧来避免瓶颈。

首先,您可以使用touch()对列表进行预排序,以更新文件修改时间,这将对opendir()返回的列表进行排序。

要进行更多优化,请使用目录作为存储桶来加速排序。例如,IMAGEDIR/a/IMAGEDIR/b/等。您可以根据需要开发更高级的目录树。

通过系统目录使用存储桶排序,它将进行优化,以便为尚未排序的项目保留单独的文件夹,并批量对整批进行排序。使用包含要排序的整个对象集的子集的存储桶,通过使任何给定的排序操作更小来加快对列表进行排序所花费的时间,并使用touch()来保留排序将减少排序的次数排序算法将运行。