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

Sql server 什么更好?查询文件系统还是查询数据库?,sql-server,performance,asp.net-mvc-3,filesystems,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

文件系统中有大约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
ID      ProductID   ImageURL
-------------------------------------------
1       10010       10010_1.jpg
2       10010       10010_2.jpg
3       10010       10010_3.jpg
4       10011       10011_1.jpg
. . .
将图像名称保存在数据库表中并运行查询以获取给定产品的可用图像列表不是更好吗?我很确定从数据库中读取它会更好。只是因为我需要一张有50万张唱片的大桌子。哪种方式更有效

我的桌子看起来像这样:

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
ID      ProductID   ImageURL
-------------------------------------------
1       10010       10010_1.jpg
2       10010       10010_2.jpg
3       10010       10010_3.jpg
4       10011       10011_1.jpg
. . .

有什么建议吗?我正在用ASP.NETMVC3重新编写这个网站。在这个平台/框架中,我还需要注意什么

数据库中50万条记录实际上并没有那么大


如果表的索引正确,那么数据库的性能将比文件系统好得多。

是的,将文件路径存储在数据库中非常重要,即使会有一些性能损失,也会更好

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

因为问题中有性能部分-原型和测量您的数据集(如果涉及性能)。原型设计/测量时应考虑的事项:

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

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

  • 混合-使用数据库存储文件在文件系统上的文件路径

  • NoSQL—完全远离数据库,使用NoSQL解决方案,该解决方案提供了访问文件系统上文件的API

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

    还有,另一项建议;使用productID作为父目录来划分目录。考虑这一点:

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

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

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

  • 数据库空间很昂贵
  • 从磁盘读取将比从关系数据库读取快
  • 如果您的所有图像都在数据库中,那么在负载平衡环境中会有更多问题
  • 从数据库中读取大量数据将对其他查询产生负面影响
  • 不管您的表示层是MVC、web表单还是控制台应用程序。您的问题在于数据库设计

  • 所有这些文件都在同一个目录中吗?在4个目录中。取决于图像大小。使用数据库会更好,如果你的db有100万条记录,性能不会下降,但当使用文件系统解决方案时,你的应用程序会死机图像位于文件系统中,我不想将它们移动到db。我只想在db中存储文件名和路径。该睡觉了。。。重读你的问题后,我所有的回答都没有多大意义。。。是的,将文件路径存储在DB中完全有意义,而且即使有一些性能损失也会更好(这是不太可能的)。更新了答案,因为它与问题无关。NoSQL听起来是个好主意。我需要对此做一些研究。这里有一篇关于.net的NoSQL解决方案的帖子:我想在数据库中存储图像名称和路径,而不是整个图像。我想对数据库运行一个查询,而不是查询文件系统是否存在该图像。