仅对部分数据使用索引慢排序

Order By Using Index Slow For Only Some Data

一个拥有 30k 项的组织,这个简单的查询要花很长时间才能到达 运行(没有完成,我必须停止它)。一个拥有 6 万个项目 returns 的独立组织非常快(400 毫秒)。为什么会这样?我需要重建索引吗?

这是我的查询:

SELECT items.*
FROM items 
WHERE items.org_id = '123-456-abc'
ORDER BY items.name ASC
LIMIT 10
OFFSET 0

这是包含 30k 个项目的组织的 EXPLAIN 输出:

Limit  (cost=0.56..3734.80 rows=10 width=307)
  ->  Index Scan using index_items_on_name on items  (cost=0.56..11272191.50 rows=30186 width=307)
        Filter: (org_id = '123-456-abc'::uuid)

对于 60k 项目组织:

Limit  (cost=0.56..1831.41 rows=10 width=307)
  ->  Index Scan using index_items_on_name on items  (cost=0.56..11272191.50 rows=61568 width=307)
        Filter: (org_id = '789-123-def'::uuid)

这个 items table 上有 20 列,我在 name 列上有一个名为 index_items_on_name 的非唯一索引(定义为 btree,排序顺序为 ASC,最后为 NULL)。我还有条形码、sku 和名称的三元组索引,但它可能不相关,因为 EXPLAIN 说它正在使用 index_items_on_name.

Schwern 说的慢是对的。为了使其更快,在 (org_id, name) 上添加索引。这样它就可以使用一个索引来做两件事,只找到请求的组织,然后按顺序读取它们。