任何SQL数据库:什么情况下获取整个表格比查询特定行更好?

3
我有一个包含大约10k到100k行的表格,我需要不同的1或2千行数据集,但通常需要的要少得多。我希望这些查询尽可能快,并且想知道哪种方法通常更明智:
  1. 始终使用不同的WHERE子句查询我需要的确切行。
  2. 将整个表格加载到我的应用程序内存缓存中进行搜索,并定期同步缓存。
  3. 始终查询整个表(无WHERE子句),让SQL服务器处理缓存(它总是相同的查询,因此可以缓存结果),并根据需要过滤输出。
我现在希望对特定的DB引擎持中立态度。
9个回答

7
对我来说,在10K到100K行的情况下,第一种方法是明显的赢家。如果是小于1K的话,我可能会建议在应用程序中缓存数据,但是对于这么多行,让数据库做它应该做的事情就好了。通过正确的索引,第一种方法将是最佳选择。 如果每次都要拉取相同的数据集,那么缓存结果可能更好,但是当您每次都使用不同的筛选条件时,还是让数据库来处理比较好。 就像我之前说过的,只需确保在所有适当的字段上进行良好的索引即可。

4

我认为,一个专门设计用于快速搜索、切片和分析信息的系统,在这方面肯定比普通开发人员的代码要快得多。然而,你没有提到的一些因素包括数据库服务器的位置或潜在位置与应用程序之间的关系 - 在较慢的网络上返回大量数据集肯定会使“获取所有数据并在本地搜索”选项更有优势。我认为,在“一般”情况下,我建议只查询您想要的内容,但在特殊情况下,其他选项可能更好。


3

我坚信在初始情况下应优先选择选项1。当您遇到性能问题时,可以考虑如何使用缓存进行优化(Dijkstra曾说过,预优化是万恶之源)。

同时,请记住,如果您选择选项3,您也将通过网络发送完整的表内容,这也会影响性能。


这实际上是 Knuth 说的。 :-) - Jason Baker

2

根据我的经验,最好查询你想要的内容,然后让数据库找到最佳的执行方式。你可以检查查询计划,看看是否有任何瓶颈可以通过索引来改善。


2

首先,让我们排除#2。查询表格是数据服务器存在的原因,它们几乎肯定会比您做的任何临时搜索工作都更好。

对于#3,您只需要说“根据需要过滤输出”,而不说过滤器在哪里完成。如果像#2一样在应用程序代码中,那么你就与#2有同样的问题。

数据库是专门为解决这个确切的问题而创建的。 它们非常擅长这样做。 让它们来处理。


1

除非 WHERE 子句本身非常庞大(即如果您的 WHERE 子句单独标识每一行,例如 WHERE id = 3 or id = 4 or id = 32 or ...),否则唯一使用选项1的原因是。


0

还有其他因素会改变您的数据吗?让SQL引擎最优地切片和切块的观点是很好的。但是,如果您正在使用数据库并且没有可能出现“其他人”更改数据,那将是令人惊讶的。如果可以在其他地方进行更改,您肯定希望经常重新查询。


0

相信SQL服务器会比你自己做缓存和过滤更好(除非性能测试表明不然)。

请注意,我说的是“负担得起”,而不仅仅是“做”。你很可能能够做得更好,但你被付费(大概)提供功能而不是缓存。

问问自己...花时间编写缓存管理代码有助于您实现需求文档吗?


-1

如果你这样做:

SELECT * FROM users;

MySQL 应该执行两个查询:一个用于了解表中的字段,另一个用于返回您请求的数据。

正在处理中

SELECT id, email, password FROM users;

由于字段是明确的,因此mysql只能访问数据。

关于限制:始终最好查询您需要的行数,不多不少。更多的数据意味着驱动它所需的时间更长。


不正确。任何SQL解释器都必须获取属性信息,以判断您的列表是否正确。否则,它怎么知道SELECT asdkfljdsalkfjsdlakf不是有效属性呢? - Matt Rogish

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