2

我最近一直在使用数据库,在此之前我正在开发不使用数据库的独立组件。在所有数据库工作中,我有一些问题浮出水面。为什么数据库查询比从文件中检索数据的编程语言更快。

为了进一步阐述我的问题 -

假设我有一个名为 Employee 的表,其中包含 Name、ID、DOB、Email 和 Sex 字段。为简单起见,我们还将假设它们都是固定长度的字符串,并且它们没有任何索引或主键或任何其他约束。

假设我们在表中有 100 万行数据。在一天结束时,该表将存储在磁盘上的某个位置。当我编写查询 Select Name,ID from Employee where DOB="12/12/1985" 时,DBMS 从文件中提取数据,处理它,过滤它并给我一个结果,它是 100 万的一个子集行数据。

现在,假设我将相同的 100 万行存储在一个平面文件中,为简单起见,每个字段同样是固定长度的字符串。数据在磁盘中的文件中可用。当我用 C++ 或 C 或 C# 或 Java 编写程序并执行查找 DOB="12/12/1985" 的名称和 ID 的相同任务时,我将逐条读取文件记录并检查每一行数据如果 DOB="12/12/1985",如果匹配,那么我存储该行给用户。

与 SQL 查询返回结果的速度相比,程序执行此操作的速度太慢了。

我假设 DBMS 也是用某种编程语言编写的,并且还有解析查询的额外开销等等。

那么,在 DBMS 中发生了什么使得检索数据比通过编程语言更快呢?

如果这个问题在这个论坛上不合适,请删除,但请给我一些可以找到答案的指示。

如果有任何帮助,我会使用 SQL Server。

4

3 回答 3

7

为什么数据库查询比从文件中检索数据的编程语言更快

这取决于很多因素——网络延迟和磁盘寻道速度是其中两个重要因素。有时从文件中读取会更快。

在您对在一百万行中查找一行的描述中,数据库通常比在文件中查找要快,因为它采用了对数据的索引

如果您预处理数据文件并为不同字段提供索引文件,您也可以加快从文件系统查找数据的速度。

注意:数据库通常不用于此功能,而是因为它们符合 ACID,因此适合在您有多个进程(通常在许多计算机上的多个客户端)同时查询数据库的环境中工作。

于 2012-04-05T16:00:19.040 回答
0

有很多技术可以加速各种访问。正如@Oded 所说,索引是您特定示例的重要解决方案:如果数据库已设置为按日期维护索引,则它可以直接转到该日期的条目,而不是通读整个文件。(请注意,维护索引确实会占用空间和时间——它不是免费的!)

另一方面,如果没有建立这样的索引,并且数据库没有按日期顺序存储,那么按日期查询将需要遍历整个数据库,就像您的平面文件程序一样。

当然,您可以编写自己的程序来维护和使用文件的日期索引,这将像数据库一样加快日期查询。而且,您可能会发现您想要添加其他索引,以加快其他类型的查询 - 或者删除一个索引,结果证明使用的资源超出其价值。

最终,管理您添加到文件管理器中的所有功能可能会成为一项复杂的任务。您可能希望将这种配置存储在其自己的文件中,而不是将其硬编码到您的程序中。至少,您需要一些功能来确保更改配置不会损坏您的文件...

换句话说,您将编写自己的数据库。

于 2012-04-05T17:52:27.357 回答
0

......一个旧的,我知道......只是为了如果有人发现这个:问题包含“假设......没有任何索引”

...所以问题是关于数据库和没有索引的平面文件之间的顺序数据读取斗争,数据库获胜......

答案是:如果你从磁盘上逐条读取,你会做大量的磁盘查找,这在性能方面是昂贵的。数据库总是按概念加载页面 - 因此一次同时加载几条记录。更少的磁盘查找肯定会更快。如果您要从平面文件中进行内存缓冲读取,您可以获得相同或更好的读取值。

于 2014-09-10T15:17:34.450 回答