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


Image Sorting with a database vs file system

我有多个图像存储在url,如:/uploads/hash/IMAGE001.jpg。使用jQuery UI的sortable(),我想异步排序和存储图像的顺序。

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

我可以为每个/hash/目录创建一个SQL表,有3列(ID, IMAGE_URL, IMAGE_INDEX),并在每次排序时更新表的_INDEX值。然后,我可以通过使用ORDER by IMAGE_INDEX查询数据库来获取IMAGE_URLs的排序列表。

我的另一个想法是使用前面的0000来命名文件(例如。/上传/散列/0000 image001.jpg)。如果我在PHP中重命名每一种类型的文件,我可以在没有SQL开销的情况下使用opendir()在PHP中获取图像的/hash/目录,然后在客户端或服务器端按文件名排序。

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

在本例中,您应该使用数据库进行排序,

  1. 数据库将建立B-tree索引并保持排序,以便快速检索和更新。
  2. 可以对文件进行范围查询
  3. 你可以改变实际文件的存储,而不耦合查找。
  4. 您可以在多台机器上使用memcache和分片扩展到大量图像

文件系统不是为排序和管理更改而设计的

  1. 虽然在文件数量小的时候比较快,但是排序的时间会越来越长。
  2. 图像本身与id紧密相连,这限制了灵活性。
  3. 将您限制在一台机器,一个目录,并且由于操作系统的限制,您将不得不通过构建越来越多的扩展,最终构建自己的伪数据库。
  4. 在服务器上这将是地狱,操作系统锁和并发管理不像db那么复杂。

对于任何"真正的"应用程序,使用DB都是这样做的方式,使用文件系统是一个快速的hack。

数据库是为存储和检索数据而设计和优化的。更改文件名以存储数据(如排序顺序)通常不是理想的选择。根据文件系统的不同,性能会有很大的差异,小故障将是灾难性的。当然可以选择database

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

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

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

通过系统目录使用桶排序,它将被优化为为尚未排序的项目保留一个单独的文件夹,并分批对整个批次进行排序。使用bucket,其中包含要排序的整个对象集合的子集,通过使任何给定的排序操作更小来加快排序所需的时间,并且使用touch()来保留排序将减少排序算法运行的次数。