当您将数以万计的文件放在一个目录中时,您使用的文件系统很重要。 Linux 上的 extfs4 比 Windows 上的 NTFS 扩展得更好。
Windows 具有 8.3 文件名的兼容模式(旧的 DOS 文件名标准)。这会导致每个长于abcdefgh.ext 的文件名都为其创建一个别名,例如abcd~123.ext。这很慢,并且当您在单个目录中有大量文件时会变得非常慢。您可以关闭这种古老的兼容性行为。看这里。 https://support.microsoft.com/en-us/kb/121007。如果您关闭它,它可以快速解决直接的性能问题。
但是,一个目录中的 20,000 个文件是一个很大的数字。在任何类型的文件系统上,最好的选择是根据更改的内容在文件系统中自动创建子目录。一种策略是根据年/月创建子目录,例如
/showcase/2015/08/image1.jpg (for images uploaded this month)
/showcase/2015/09/image7.jpg (for images next month)
将那些较长的文件名存储在表中的s_image 列中显然没有问题。
或者,如果你有一些系统来命名图像,利用它来创建子目录。例如,如果您的图像被命名
cat0001.jpg
cat0002.jpb
...
cat0456.jpg
...
cat0987.jpg
您可以根据名称的前五个字母创建子目录
/showcase/cat00/cat0001.jpg
/showcase/cat00/cat0002.jpb
...
/showcase/cat04/cat0456.jpg
...
/showcase/cat09/cat0987.jpg
如果您这样做,最好保持图像名称完整而不是缩短它们(例如,不要这样做/showcase/cat09/87.jpg),因为如果您必须按名称搜索特定图像,您希望那里有全名。
据我所知,文件系统中没有什么可以自动为您执行此操作。但是在你的程序中做起来并不难。