【问题标题】:Unused index in PostgreSQLPostgreSQL 中未使用的索引
【发布时间】:2022-08-21 15:40:21
【问题描述】:

我现在正在学习 PostgreSQL 中的索引。我开始尝试创建索引并分析它将如何影响执行时间。我用这样的列创建了一些表:

另外,我用数据填充了它们。之后我创建了我的自定义索引:

create index events_organizer_id_index on events(organizer_ID);

并执行此命令(事件表包含 148 行):

explain analyse select * from events where events.organizer_ID = 4;

我很惊讶在没有我的索引的情况下执行了搜索,我得到了这个结果:

据我所知,如果在搜索中使用了我的索引,则会出现“事件索引扫描”之类的文本。 那么,有人可以解释或参考网站,请,如何有效地使用索引以及我应该在哪里使用它们来查看差异?

  • events 表中有多少行?
  • @D-Shih,148 行
  • 那是一个几乎是空的表,在使用索引时会使查询变慢。添加更多数据以获得实数

标签: sql postgresql postgresql-14


【解决方案1】:

从“过滤器删除的行:125”中,我看到事件表中的行太少。只需添加数千行并再试一次

来自docs

使用真实数据进行实验。使用测试数据设置索引会告诉您测试数据需要哪些索引,但仅此而已。

使用非常小的测试数据集尤其致命。尽管 从 100000 行中选择 1000 行可能是索引的候选者,很难从 100 行中选择 1 行,因为 100 行可能适合单个磁盘页面,并且没有计划可以 节拍顺序获取 1 个磁盘页面。

在大多数情况下,当数据库使用索引时,它只会获取行所在的地址。它包含数据 block_id 和偏移量,因为一个 4 或 8 Kb 的块中可能有很多行。

因此,数据库首先在索引中搜索块地址,然后在磁盘上查找块,读取它并解析您需要的行。

当行数太少时,它们可以放在几个数据块中,这使得 DB 可以更轻松、更快速地读取整个表,而无需使用索引。

【讨论】:

    【解决方案2】:

    通过以下方式查看: 数据库决定哪种方式可以更快地找到您的带有 Organizer_id 4 的元组(=记录)。有两种方式: a) 读取索引,然后跳到包含数据的块。 b) 读取堆并在那里找到记录。

    屏幕截图中的信息显示 126 条记录(125 条跳过 + 您的记录),长度(“宽度”)为 62 字节。包括开销,这些数据适合两个 8 KB 的数据库块。由于旋转磁盘或 SSD 无论如何都会读取一系列块 - 它们总是将更多块读取到缓冲区中 - 这是这两个块的一个读取操作。

    所以数据库认为首先读取索引以找到正确的记录(在我们的例子中是两个块)然后从索引中的信息读取堆中的数据是没有意义的。那将是两个读取操作。即使使用比旋转磁盘更新的现代技术,这也需要更多的时间,而不仅仅是扫描两个块。这就是数据库不使用索引的原因。

    这种小表上的索引不适合搜索。然而,唯一索引避免了重复条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多