查询List<T>还是数据库更快?

17

最近我遇到了几种需要从同一张表中获取不同数据的情况。其中一个例子是,我将循环遍历每个“送货司机”,并为他们要配送的每个客户生成可打印的PDF文件。

在这种情况下,我提取了所有客户并将它们存储在

List<Customer> AllCustomersList = customers.GetAllCustomers();

当我遍历递送司机时,我会做类似于这样的事情:

List<Customer> DeliveryCustomers = AllCustomersList.Where(a => a.DeliveryDriverID == DriverID);

我的问题是:我所采取的查询 List 对象的方法是否比每次查询与送货司机相关联的客户记录的数据库更快?


我无法想象从数据库中提取数据比像您目前正在做的一样在内存中完成所有操作更好的方式... 我唯一能想到的就是确保您不会提取比您要使用的更多的数据... - Jared
1
查询列表应该会快得多,因为它将存储在内存中。 - Ayush
在什么时候,数据量变得太大无法放入列表中,需要使用数据库? - Ricketts
2
@xbonez。这不是真的。数据库是为过滤大量数据而构建的,如果有大量数据,应使用数据库而不是内存。 - gdoron
2
@xbonez - 虽然对于较小的数据集,你是正确的,但对于非常大的数据集(可能是数万个、数百万个或更多),由于索引和内存中数据集的组织,数据库变得更加高效。当然,如果数据库可以将整个数据集保留在内存中,那么它比保存在磁盘上更有效率。 - codekaizen
3个回答

15

没有一个精确的数字可以告诉你当你超过多少行时应该查询数据库而不是使用内存中的 List<T>

但是,经验法则是,数据库被设计用于处理大量数据,并且它们有优化“机制”,而在内存中则没有这样的机制。

因此,您需要对其进行基准测试,以确定每次重要的操作中访问数据库的往返是否值得处理那么多的行。

"我们应该忘记小的效率问题,大约97%的时间,过早地优化是万恶之源"


1
避免往返数据库是关于数据库性能调优的主要规则之一,特别是当数据库位于网络上并且有多个用户访问时。
从另一个角度来看,将大量结果集带入内存(例如您的客户数据)不是高效的,可能比在需要时访问数据库更慢。
使用内存集合来避免往返请求的好方法是用于查找表(例如客户类别、客户地区等),这些表不经常更改。这样您就可以避免在主要客户选择查询中进行连接,从而使其更快。

1

为什么不使用Redis?它是一种内存数据库,速度非常快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接