仅对部分数据使用索引慢排序
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)
上添加索引。这样它就可以使用一个索引来做两件事,只找到请求的组织,然后按顺序读取它们。
一个拥有 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)
上添加索引。这样它就可以使用一个索引来做两件事,只找到请求的组织,然后按顺序读取它们。