当前位置: 首页 > 面试题库 >

用LIMIT 1索引ORDER BY

束研
2023-03-14
问题内容

我正在尝试获取表中的最新行。我有一个简单的时间戳created_at索引。当查询时ORDER BY created_at DESC LIMIT 1,它花费的时间远远超出我的预期(在36k行的计算机上大约需要50毫秒)。

EXPLAIN -ing它使用的权利要求 向后索引扫描 ,但我确认,更改索引是(created_at DESC)不会改变的查询规划的费用为一个简单的 索引扫描

如何优化此用例?

运行postgresql 9.2.4

编辑:

# EXPLAIN SELECT * FROM articles ORDER BY created_at DESC LIMIT 1;
                                                  QUERY PLAN                                                       
-----------------------------------------------------------------------------------------------------------------------
Limit  (cost=0.00..0.58 rows=1 width=1752)
   ->  Index Scan Backward using index_articles_on_created_at on articles  (cost=0.00..20667.37 rows=35696 width=1752)
(2 rows)

问题答案:

假设我们正在处理一个 大表 ,则
部分索引
可能会有所帮助:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC)
WHERE created_at > '2013-09-15 0:0'::timestamp;

正如您已经发现的那样:下降或上升在这里几乎无关紧要。Postgres可以以几乎相同的速度向后扫描(例外适用于多列索引)。

查询以使用此索引:

SELECT * FROM tbl
WHERE  created_at > '2013-09-15 0:0'::timestamp -- matches index
ORDER  BY created_at DESC
LIMIT  1;

这里的重点是使索引 更小 ,因此应该更容易缓存和维护。

  1. 您需要选择一个可以保证比最新时间戳更小的时间戳。
  2. 您应该不时重新创建索引以切断旧数据。
  3. 条件必须为IMMUTABLE

因此,一次性效果会随着时间的流逝而恶化。在 具体的问题 是硬编码的条件:

WHERE created_at > '2013-09-15 0:0'::timestamp

自动化

您可以不时手动更新索引和查询。或者,您可以借助这样的功能将其自动化:

CREATE OR REPLACE FUNCTION f_min_ts()
  RETURNS timestamp LANGUAGE sql IMMUTABLE AS
$$SELECT '2013-09-15 0:0'::timestamp$$

指数:

CREATE INDEX tbl_created_recently_idx ON tbl (created_at DESC);
WHERE created_at > f_min_ts();

询问:

SELECT * FROM tbl
WHERE  created_at > f_min_ts()
ORDER  BY created_at DESC
LIMIT  1;

通过cron作业或某些基于触发器的事件自动进行娱乐。您的查询现在可以保持不变。但是您 需要 在更改此函数后以任何方式 重新创建所有索引
。只需拖放并创建每个。

第一的 ..

…测试您是否真的以此击中了瓶颈。

尝试是否简单地DROP index ... ; CREATE index ...完成工作。然后,您的索引可能已膨胀。您的自动真空设置可能已关闭。

或者尝试VACUUM FULL ANALYZE让您的整个表以及原始状态的索引再检查一次。

其他选项
包括常规的常规性能调整和覆盖索引,具体取决于您从表中实际获取的内容。



 类似资料:
  • 本文向大家介绍MySQL索引使用说明(单列索引和多列索引),包括了MySQL索引使用说明(单列索引和多列索引)的使用技巧和注意事项,需要的朋友参考一下 1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列。请看下面这个查询: 这个查询与前面的查询略有不同,但仍属于简单查询。由于age是

  • 主要内容:一、索引概述,1.索引的分类,二、索引的创建,1.创建表时创建索引,2. 在已经存在的表上创建索引,三、删除索引,四、隐藏索引,五、哪些情况下适合创建索引,1.频繁作为 WHERE 查询条件的字段,2. 有唯一性限制的字段,3.经常GROUP BY和ORDER BY的列,4.UPDATE、DELETE的WHERE条件列,,5.DISTINCT字段需要创建索引,6.多表JOIN连接操作时,7. 使用列的类型小的创建索引,,,,,,,,,,,,上一篇我们主要是对索引设计体系的一个讲解,本篇

  • 问题内容: 我有一个清单说。我想为每个唯一值分配一个特定的“索引”来获取。 这是我的代码: 事实证明这很慢。 具有1M个元素和100K个唯一元素。我也尝试过用lambda和sort进行地图操作,这没有帮助。这样做的理想方法是什么? 问题答案: 由于执行线性搜索,然后对中的每个元素执行线性搜索,因此导致代码变慢。因此,对于每1M个项目,您要进行(最多)100K个比较。 将一个值转换为另一个值的最快方

  • _ | A | B | C | D | E | F | G | H | I | J | L | M | N | O | P | R | S | T | U | V | W | X _ __nonzero__() (scrapy.selector.Selector 方法) (scrapy.selector.SelectorList 方法) A adapt_response() (scrapy.con

  • A AC97,AC97接口 ATAPI(AT Attachment Packet Interface, (IBM PC)AT附属包接口),USB驱动程序的协议信息 atomic instructions(原子操作指令),原子操作指令和内存栅 atomic operations(原子操作),内核中的锁 atomically protected variables(原子保护变量),原子保护变量 B B

  • 符号 -CURRENT,追踪开发分支 -STABLE,追踪开发分支 .k5login,用户配置文件: .k5login 和 .k5users .k5users,用户配置文件: .k5login 和 .k5users .rhosts,Dump 和 Restore /boot/kernel.old,建立并安装一个定制的内核 /etc,分区规划 /etc/gettytab,/etc/gettytab /

  • A arguments(参数), 缓冲区溢出 B bounds checking(边界检查) compiler-based(基于编译器的), 基于编译器运行时边界检查 library-based(基于库的), 基于库运行时边界检查 buffer overflow, 基于编译器运行时边界检查 buffer overflow(缓冲区溢出), 缓冲区溢出 C chroot(), 限制你的程序环境 con

  • 原文:Indexing 另见:Indexing routines 数组索引指的是使用方括号([])来索引数组值。有很多选项来索引,这使numpy索引很强大,但功能上的强大也带来一些复杂性和潜在的混乱。本部分只是与索引相关的各种选项和问题的概述。除了单个元素索引之外,大多数这些选项的细节可以在相关章节中找到。 赋值与引用 以下大多数示例显示了在引用数组中的数据时使用索引。这些示例在给数组赋值时同样适