【问题标题】:SQL - Get specific row without a full table scanSQL - 无需全表扫描即可获取特定行
【发布时间】:2018-03-29 23:09:56
【问题描述】:

我正在使用 Postgresql (cockroachdb),我想选择一个特定的行。例如,有数千条记录,我想选择行号 999。

在这种情况下,我们将使用 LIMIT 和 OFFSET,SELECT * FROM table LIMIT 1 OFFSET 998;

但是,根据this post,使用 LIMIT 和 OFFSET 可能会导致性能问题。所以我想知道是否有办法在不进行全表扫描的情况下获取特定行。

我觉得这是可能的,因为数据库似乎按主键对数据进行排序,当我执行SELECT * FROM table; 时,它总是显示排序结果。由于是按主键排序的,所以数据库可以使用索引来访问特定的行,对吧?

【问题讨论】:

  • 你也可以,指定WHERE PrimaryKey = Value。但这并没有为数据库提供一种快速跳转到行的快速方法,如果我们按顺序对它们进行编号,将是第 999 行,尽管它已排序,但您无法在字典中快速找到第 999 个单词。 (无论如何,您都可以想出一些技巧来快速到达那里——这些技巧实际上确实会在一定程度上转化为数据库。)

标签: sql cockroachdb


【解决方案1】:

如果您根据主键选择行(例如SELECT * FROM table WHERE <primary key> = <value>),则无需在后台进行扫描。如果您在表上定义二级索引并应用基于二级索引中的列进行过滤的WHERE 子句,情况也是如此。

【讨论】:

  • 这非常可靠。我认为我应该利用主键和辅助键来实现我的目标。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多