任何SQL数据库:什么时候更好地获取整个表而不是查询特定的行?

时间:2009-01-22 15:45:00

标签: sql database

我有一个包含10k到100k行的表,我需要多达1到2千行的不同集合,但通常要少得多。我希望这些查询尽可能快,我想知道哪种方法通常更聪明:

  1. 始终使用一直不同的WHERE子句来查询我需要的行。
  2. 将整个表格加载到我的应用程序内存中的缓存中,并在那里搜索,定期同步缓存
  3. 始终查询整个表(没有WHERE子句),让SQL服务器处理缓存(它总是相同的查询,以便它可以缓存结果)并根据需要过滤输出
  4. 我现在想要了解特定的数据库引擎。

9 个答案:

答案 0 :(得分:7)

10K到100K行,1号对我来说是明显的赢家。如果它是< 1K我可能会说它在应用程序中保持缓存,但是有了这么多行,让DB按照它的设计去做。使用适当的索引,数字1将是最好的选择。

如果你每次都反复提取同一组数据,那么缓存结果可能也是一个更好的选择,但是当你要一直有不同的地方时,最好让数据库搞定此事。

就像我说的那样,只要确保你在所有适当的字段上做好准备。

答案 1 :(得分:4)

在我看来,用于快速搜索,切片和切割信息的设计的系统将比普通开发人员的代码快得多。另一方面,你没有提到的一些因素包括数据库服务器相对于应用程序的位置或潜在位置 - 在较慢的网络上返回大型数据集肯定会有利于“抓住所有”在本地搜索“选项。我认为,在“一般”情况下,我建议您查询您想要的内容,但在特殊情况下,其他选项可能会更好。

答案 2 :(得分:3)

我坚信在初始情况下应该首选备选方案1。 遇到性能问题时,可以查看如何使用缓存对其进行优化。 (预先优化是所有邪恶的根源,Dijkstra曾经说过)。

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

答案 3 :(得分:2)

根据我的经验,最好查询您想要的内容,让数据库找出最佳方法。您可以检查查询计划,看看是否还有任何可能由索引帮助的瓶颈。

答案 4 :(得分:2)

首先,让我们解雇#2。搜索表是数据服务器存在的原因,他们几乎肯定会比你做的任何临时搜索做得更好。

对于#3,你只是说“根据需要过滤输出”,而不说过滤器的位置。如果它在#2中的应用程序代码中,那么与#2一样,比你遇到同样的问题作为#2。

专门创建数据库来处理这个确切的问题。他们非常擅长。让他们这样做。

答案 5 :(得分:1)

使用除选项1以外的任何内容的原因是WHERE子句本身是巨大的(即,如果您的WHERE子句单独标识每一行,例如{{ 1}})。

答案 6 :(得分:0)

还有其他改变你的数据吗?关于让SQL引擎最佳切片和切块的观点是一个很好的观点。但是,如果您使用数据库并且没有“别人”更改数据的可能性,那将是令人惊讶的。如果可以在其他地方进行更改,您当然希望经常重新查询。

答案 7 :(得分:0)

相信SQL服务器在缓存和过滤方面都能比你自己做得更好(除非性能测试另有说明。)

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

问问自己......是否花时间编写缓存管理代码来帮助您完成需求文档?

答案 8 :(得分:-1)

如果你这样做:

SELECT * FROM users;

mysql应该执行两个查询:一个用于查询表中的字段,另一个用于恢复您要求的数据。

操作

SELECT id, email, password FROM users;

mysql只能访问数据,因为字段是显式的。

关于限制:总是最好查询您需要的行数,不多也不少。更多数据意味着有更多时间来推动它