SQL - 在没有完整 table 扫描的情况下获取特定行
SQL - Get specific row without a full table scan
我正在使用 Postgresql (cockroachdb),我想 select 一个特定的行。比如有几千条记录,我想select行号999.
在这种情况下,我们将使用 LIMIT 和 OFFSET,SELECT * FROM table LIMIT 1 OFFSET 998;
但是,根据 this post,使用 LIMIT 和 OFFSET 会导致性能问题。所以我想知道是否有办法在没有完整 table 扫描的情况下获取特定行。
我觉得这是可能的,因为数据库似乎按主键对数据进行排序,当我这样做时 SELECT * FROM table;
它总是显示排序结果。既然是按主键排序,那么数据库可以使用索引来访问特定的行,对吧?
如果您 select 行基于主键(例如 SELECT * FROM table WHERE <primary key> = <value>
),则不需要在引擎盖下进行扫描。如果您在 table 上定义二级索引并应用根据二级索引中的列进行过滤的 WHERE
子句,情况也是如此。
我正在使用 Postgresql (cockroachdb),我想 select 一个特定的行。比如有几千条记录,我想select行号999.
在这种情况下,我们将使用 LIMIT 和 OFFSET,SELECT * FROM table LIMIT 1 OFFSET 998;
但是,根据 this post,使用 LIMIT 和 OFFSET 会导致性能问题。所以我想知道是否有办法在没有完整 table 扫描的情况下获取特定行。
我觉得这是可能的,因为数据库似乎按主键对数据进行排序,当我这样做时 SELECT * FROM table;
它总是显示排序结果。既然是按主键排序,那么数据库可以使用索引来访问特定的行,对吧?
如果您 select 行基于主键(例如 SELECT * FROM table WHERE <primary key> = <value>
),则不需要在引擎盖下进行扫描。如果您在 table 上定义二级索引并应用根据二级索引中的列进行过滤的 WHERE
子句,情况也是如此。