【发布时间】:2017-08-12 14:49:09
【问题描述】:
我的 pg 是 9.5+。 我在“body”列中有一个 jsonb 数据:
{
"id":"58cf96481ebf47eba351db3b",
"JobName":"test",
"JobDomain":"SAW",
"JobStatus":"TRIGGERED",
"JobActivity":"ACTIVE"
}
我为正文和键创建索引:
CREATE INDEX scheduledjob_request_id_idx ON "ScheduledJob" USING gin ((body -> 'JobName'));
CREATE INDEX test_index ON "ScheduledJob" USING gin (body jsonb_path_ops)
这是我的疑问:
SELECT body FROM "ScheduledJob" WHERE body @> '{"JobName": "analytics_import_transaction_job"}';
SELECT body FROM "ScheduledJob" WHERE (body#>'{JobName}' = '"analytics_import_transaction_job"') LIMIT 10;
那些是返回正确的数据,但没有人使用索引。 我看到了解释:
-> Seq Scan on public."ScheduledJob" (cost=0.00..4.55 rows=1 width=532)
所以,我不知道为什么不使用索引,以及如何正确使用jsonb的索引。
更新:
- 我在插入数据之前创建了索引,查询可以使用索引。
- 但我在插入第一条数据后创建索引,查询将是 扫描所有记录。
这太奇怪了,我先插入数据时如何使索引有用。
【问题讨论】:
-
带有
body#>'{JobName}'的查询永远不会使用(body -> 'JobName')的索引。使用相同的表达式(即相同的运算符)至少有机会。 -- 请发布EXPLAIN ANALYZE您的查询。您的表可能没有足够的样本行来使用索引。 -
除此之外,对于第一个索引,您最好使用
INDEX ON "ScheduledJob" USING btree ((body ->> 'JobName'))。 -
我的表的行现在是 900。这是否太小而无法使用索引?
-
我尝试了btree,但也有同样的问题。
-
我把数据加到10000行,查询使用索引!!!谢了!!!
标签: postgresql indexing jsonb