sql-从文件或数据库服务器访问数据更快吗?

如果我有一个由文件夹和文件组成的静态数据库,那么考虑到将CGI脚本中使用的数据库,访问和操作是否比SQL Server类型数据库更快?

使用文件和文件夹时,提高性能的秘诀是什么?

Jeremy Gwa asked 2020-01-24T00:45:54Z
11个解决方案
58 votes

我将添加到它取决于人群。

这种问题没有通用答案,但在很大程度上取决于当前的情况。 我什至最近甚至将一些数据从SQL数据库移到了平面文件系统,因为数据库的开销以及一些数据库连接可靠性问题使使用平面文件成为更好的选择。

在做出选择时,我会问自己一些问题:

  1. 我如何使用数据? 例如,我只是按输入的顺序从头到尾读取行吗? 还是我要搜索匹配多个条件的行?

  2. 在一个程序执行期间,我将多久访问一次数据? 我会以萨林格(Salinger)为作者去一次获得所有书籍吗?还是会去几次以得到几位不同的作者呢? 我会为几个不同的标准多次尝试吗?

  3. 我将如何添加数据? 我可以在行末尾附加一行,这对我的检索来说是完美的,还是需要重新使用?

  4. 六个月后代码看起来有多逻辑? 我之所以强调这一点,是因为我认为在设计事物时常常会忘记这一点(不仅仅是代码,这匹业余爱好实际上是我作为海军机械师诅咒机械工程师的日子)。 在六个月内,我必须维护您的代码(或在完成另一个项目后再执行)时,哪种方式存储和检索数据更有意义。 如果将平面文件转换为DB效率提高了1%,但是如果必须更新代码又花了一周的时间来弄清事情,那么您真的可以改善。

HerbN answered 2020-01-24T00:46:34Z
19 votes

取决于您的信息是什么以及访问方式和规模是什么。 关系数据库的两个最大好处是:

  1. 正在缓存。 除非您非常聪明,否则您将无法编写与数据库服务器一样好的缓存。

  2. 优化器。

但是,对于某些特定的应用程序,这两个优点与文件+文件夹数据存储区相比都没有表现出来-因此答案是一个响亮的“依赖”。

至于文件/文件夹,诀窍是:

  • 缓存经常请求的文件的内容
  • 具有较小的目录(由于读取大目录的内容需要花费时间,因此在深度嵌套的小目录中访问文件比在扁平结构中访问文件要快得多)。
  • 还有其他更高级的优化(跨磁盘切片,放置在磁盘或不同分区中的不同位置等)。但是,如果您需要THAT级别,最好首先使用数据库。
DVK answered 2020-01-24T00:47:26Z
19 votes

通常,数据库比文件慢。

如果您需要对文件建立索引,则如果正确执行操作,则自定义索引结构上的硬编码访问路径将始终具有更快的潜力。

但是,通过基于文件的解决方案选择数据库时,“性能”不是目标。

您应该问自己,您的系统是否需要数据库可以提供的任何好处。 如果是这样,那么小的性能开销是完全可以接受的。

所以:

  1. 您需要处理多个用户和并发更新吗? (嗯;您确实说过这是静态的。)
  2. 您是否需要灵活性以便从各种角度轻松查询数据?
  3. 您是否有多个用户,并可以利用现有的安全模型来受益?

基本上,问题是更多的问题将更易于开发。 两者之间的性能差异不值得浪费开发时间。

Disillusioned answered 2020-01-24T00:48:22Z
10 votes

根据我的一点经验,与本地文件系统相比,基于服务器的数据库(甚至是在本地计算机上服务的数据库)的吞吐速度往往很慢。 但是,这取决于某些事情,其中之一是渐进复杂性。 将扫描大型文件列表与使用带有索引的数据库来查找项目的比较相比,数据库获胜。

我的一点经验是使用PostgreSQL。 我有一个有300万行的表,然后去更新了仅8,000条记录。 花了8秒钟。

至于“过早的优化是万恶之源。”这句话,我会一针见血。 如果您使用数据库编写应用程序,然后发现它运行缓慢,那么切换到基于文件系统的方法或其他方法(例如SQLite)可能会花费大量时间。 我会说,最好的选择是创建工作负载的非常简单的原型,并使用两种方法对其进行测试。 我相信重要的是要知道在这种情况下哪个更快。

Joey Adams answered 2020-01-24T00:48:52Z
5 votes

正如其他人指出的那样:这取决于!

如果您确实需要找出哪种性能更符合您的目的,则可能需要生成一些样本数据以每种格式存储,然后运行一些基准测试。 Benchmark.pm模块是Perl附带的,它使得与以下内容进行并排比较相当简单:

use Benchmark qw(:all) ;

my $count = 1000;  # Some large-ish number of trials is recommended.

cmpthese($count, {
    'File System' => sub { ...your filesystem code... },
    'Database'    => sub { ...your database code... }
});

您可以键入perldoc Benchmark以获取更多完整的文档。

John Hyland answered 2020-01-24T00:49:22Z
3 votes

如果站点结构合适,则在图像时使用文件而不是db非常有用。 创建代表您的匹配数据的文件夹,并将图像放在其中。 例如,您有一个文章站点,您将文章存储在db中。 您不必将图像路径放置在db上,无需使用主键(例如1,2,3 ..)来命名文件夹并将图像放置在其中。 电子书,音乐文件,视频,这种方法可以在所有媒体文件中使用。 如果您不搜索某些内容,则xml文件也可以使用相同的逻辑。

Kuzgun answered 2020-01-24T00:49:42Z
1 votes

这取决于数据的配置文件以及访问数据所用的逻辑。 如果只需要保存和获取命名节点,则基于文件系统的数据库可能会更快,更高效。 (为此,您也可以查看Berkeley DB。)如果需要进行基于索引的搜索,尤其是如果需要基于键联接不同的数据集,那么SQL数据库是最好的选择。

我只会选择最适合您的应用程序的解决方案。

Nate C-K answered 2020-01-24T00:50:08Z
1 votes

正如其他人所说,这取决于:数据的大小和性质以及您计划在该数据上运行的操作。

特别是对于CGI脚本,在每个页面视图上连接数据库服务器都会带来性能上的损失。 但是,如果您创建一种基于天真的文件的方法,则很容易造成性能更差的问题;-)

除了Berkeley DB File解决方案之外,您还可以考虑使用SQLite。 这将为存储在本地文件中的数据库创建一个SQL接口。 您可以使用DBI和SQL访问它,但是没有服务器,配置或网络协议。 如果将来需要数据库服务器,这可以简化迁移过程(例如:如果您决定拥有多个前端服务器,但需要共享状态)。

在不知道任何细节的情况下,我建议使用SQLite / DBI解决方案,然后再检查性能。 这将提供合理的简单启动和良好性能的灵活性。

FalseVinylShrub answered 2020-01-24T00:50:42Z
1 votes

要快速访问文件,取决于您的工作,mmap非常方便。 我只是在Effective Perl博客中以Memory-map文件的形式对此进行了编写,而不是将其作为主题。

但是,我希望数据库服务器会更快。 当我们不知道您在做什么,需要访问哪种数据等等时,很难说什么对您更快。

brian d foy answered 2020-01-24T00:51:07Z
0 votes

我会给你其他人给你的相同答案,看情况

在具有返回数据的单个服务器的简单情况下(只读),“是”文件系统将非常好并且易于管理。

但是,当您拥有多台服务器时,您将不得不管理分布式文件系统,例如glusterfs,ceph等。

数据库是一种为您管理所有数据库,分布式文件系统,压缩,读/写,锁等的工具。

希望对您有所帮助。

Doron Segal answered 2020-01-24T00:51:45Z
0 votes

像其他人所说的那样,数据库是一个工具,它会产生一些开销,但是如果您的数据是静态的并且它是只读数据,则从文件中读取目录会更快:这是我已经完成的一些测试:我有名为.csv的文件在数据库中,我已将列索引为“日期”,以便在数据库中找到相同的记录。 每天有30K-50K记录/行和100列不同类型的数据(浮点数为90%)。

数据库信息:   PostgreSQL 11.5,16GB RAM

  Table:
    335,162,867 records
    Table size: 110GB
    Index size: 7GB
    Total size: 117GB
  Files:
    Number of files: 8033
    Total Files size: 158GB
    Number of records/lines per file/date: 30K - 50K

不断从文件读取随机日期(1986-2019)的数据   比在PostgreSQL中读取相同日期的数据快4-5倍

Vlad Bezden answered 2020-01-24T00:52:14Z
translate from https://stackoverflow.com:/questions/2147902/is-it-faster-to-access-data-from-files-or-a-database-server