Bha*_*rat 7 postgresql index primary-key sorting
我的 Rails 数据库由 Postgres 数据库支持。您可能知道,Rails 中的每个表都分配了一个主键,该主键是 Integer 类型并已编入索引。
我的列表视图以相反的时间顺序显示记录。所以我只是按照主键的相反顺序对我的结果集进行排序。
我的问题是:查询会使用主键索引吗?如果是,那么那么有效吗?我如何验证?
在此先感谢您的时间。
巴拉特
来自 Postgres 文档:第 11 章索引(请注意,即使对于像8.3 章 11. 索引这样的非常旧的版本也是如此):
默认情况下,B 树索引按升序存储它们的条目,最后是空值。这意味着对列 x 上的索引进行前向扫描会产生令人满意的输出
ORDER BY x(或更详细地说,ORDER BY x ASC NULLS LAST)。索引也可以向后扫描,产生令人满意的输出ORDER BY x DESC(或更详细地说ORDER BY x DESC NULLS FIRST,因为NULLS FIRST是 的默认值ORDER BY DESC)。
现在,该索引是否将用于特定语句,这实际上取决于语句。对于返回整个表或其中大部分的查询:
SELECT *
FROM tablex
ORDER BY tablexID DESC ;
Run Code Online (Sandbox Code Playgroud)
无论如何它都必须扫描整个表,因此优化器可能会决定只读取整个表然后按降序对其进行排序(而不使用此索引)更便宜。
如果是这样的查询,我敢打赌它只会使用索引(因为它不需要任何其他数据,但需要存储在索引中的 ID):
SELECT tablexID
FROM tablex
WHERE tablexID <= 5000
ORDER BY tablexID DESC ;
Run Code Online (Sandbox Code Playgroud)
因此,是否使用索引,实际上取决于您正在执行的语句、缓存设置、连接类型、您拥有的条件、所有可用/相对索引、表的统计信息和指数(大小、分布、基数等)、Postgres 的版本(不同的版本意味着不同的优化)、月相以及我可能忘记的许多其他因素。
要检查哪些索引(如果有)将用于特定时间的特定语句,您可以使用EXPLAIN以下命令查看其执行计划:
索引通常是单向的。由于不需要维护反向链接,因此可以提高空间和索引扫描速度。正如 @a_horse_with_no_name 所指出的,Postgres 可以并且将会用于以与索引相反的顺序进行搜索。(如果这不是没有 NULL 的唯一索引,则可以考虑将 NULL 定位为 FIRST/LAST。)性能可能不如使用非标准索引排序快,并且文档指出,使用非标准索引排序可以获得显着的加速。 - 标准订购。
对于不支持向后扫描索引的系统,如果您的索引是升序的,则它不会用于您的查询。在这种情况下有两种选择:
DESC;或者DESC。(我没有尝试过这个,而且可能也不会,因为它打破了我对主键的期望。)