什么是更好的?查询文件系统还是查询数据库?

时间:2012-03-23 05:40:02

标签: sql-server performance asp.net-mvc-3 filesystems

我们有大约50万个图像驻留在文件系统中。多个图像属于产品,并以ProductID命名。例如,产品ID 10010有3个图像; 10010_1.jpg,10010_2.jpg和10010_3.jpg。要在照片库中显示这3个图像,经典ASP中的当前代码正在查询文件系统。代码看起来像这样:

Dim objFSO, i
Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 
i=1
While objFSO.FileExists(Server.MapPath(productid & "_" & i & ".jpg")
    ' draw the image
    i = i + 1
WEnd

将图像名称保存在数据库表中并运行查询以获取给定产品的可用图像列表是不是更好?我很确定从数据库中读取它更好。只是不情愿,因为我需要一个有50万条记录的大桌子。哪种方式更有效?

我的表格看起来像这样:

ID      ProductID   ImageURL
-------------------------------------------
1       10010       10010_1.jpg
2       10010       10010_2.jpg
3       10010       10010_3.jpg
4       10011       10011_1.jpg
. . .

有什么建议吗?我正在ASP .NET MVC 3中重写这个网站。我需要在这个平台/框架中做些什么吗?

4 个答案:

答案 0 :(得分:2)

IMO,您可以实施两种解决方案之一。

  1. 混合 - 使用数据库将文件路径存储到文件系统上存在的文件中。

  2. NoSQL - 完全脱离数据库并使用NoSQL解决方案,该解决方案提供了访问文件系统上文件的API。

  3. 我已经看到使用了两种实现,在#2出现之前#1变得流行。即使我已经使用#1更长时间,我觉得#2是存储“资产”数据(图像,html描述,视频文件)的最佳选择。 NoSQL在访问资产数据方面优于MySQL的主要原因是,您不是为了拉动文件路径而浪费宝贵的数据库连接。

    另外,另一项建议;使用productids作为父目录将您的目录分块。考虑一下:

    # yours
    dir1
      ... 125K files
    dir2
      ... 125K files
    
    # chunked (parent dirs are product ids)
    3
      ... 3 files
    4 
      ... 2 files
    5 
      ... 3 files
    

    在只有少数(<100个文件)的目录中统计文件比在数千个文件的目录中的stat文件快得多。

答案 1 :(得分:0)

数据库中有50万条记录并不是那么大。

如果您的表被正确编入索引,那么您将从数据库获得比文件系统更好的性能。

答案 2 :(得分:0)

是的,在DB中存储文件路径会使总体情况变得更好,即使有一些性能损失也会更好。

请注意,在磁盘(文件)和数据库(文件路径)上存储数据会使数据不一致的应用程序出现新的错误类。在迁移过程中考虑到这一点。

由于问题的性能部分 - 如果性能受到关注,您的数据集的原型和度量。原型设计/测量时需要考虑的事项:

  • 您不需要为此构建站点,从磁盘/数据库读取数据的简单控制台应用程序可能足以启动。
  • 尝试不同的文件布局(即在一个目录中存储大量文件可能会减慢搜索文件的速度)
  • 确保您知道是否会缓存数据。如果你的数据库太大而无法缓存,那么当它适合内存时,你会获得完全不同的数字。不要忘记,根据服务器配置,一些其他服务也可能会竞争相同的内存。

答案 3 :(得分:0)

要考虑的事情。我假设它是一个.NET堆栈,所以:

  1. 数据库空间昂贵
  2. 从磁盘读取将比从关系数据库读取
  3. 更快
  4. 如果您的所有图片都在数据库中,那么在负载平衡环境中会遇到更多问题
  5. 从数据库中读取大量数据会对其他查询产生负面影响
  6. 表示层是MVC,Web表单还是控制台应用程序并不重要。您的问题出在数据库设计中。