我有以下形式的查询:
SELECT * FROM twitter_personas WHERE twitter_user_id IN ($1, $2, $3, ..., $25000)
IN 查询有 10 到 25000 个值。查询一次运行几分钟。我有将近 500,000 个这样的查询积压。
twitter_user_id 列已编入索引。关于如何加快速度的任何想法?
# \d twitter_personas
Table "public.twitter_personas"
Column | Type | Modifiers
------------------+------------------------+------------------------------------------------------------
persona_id | uuid | not null
twitter_user_id | bigint |
screen_name | character varying(40) | not null
avatar_url | text |
hashval | integer | not null default nextval('personas_hashval_seq'::regclass)
Indexes:
"twitter_personas_pkey" PRIMARY KEY, btree (persona_id)
"index_twitter_personas_on_screen_name" UNIQUE, btree (screen_name)
"index_twitter_personas_on_screen_name_persona_id" btree (screen_name, persona_id)
"index_twitter_personas_twitter_user_id" btree (twitter_user_id) WHERE twitter_user_id IS NOT NULL
IN() 使用许多参数将导致在许多情况下进行顺序表扫描。这可能会很慢,具体取决于表的大小和系统的速度。
创建一个包含所有变量的临时表并加入该表:
使用 EXPLAIN 查看查询计划之间的差异。
另一种选择是使用 ANY。
我运行了一个包含 1000 个参数的查询,使用 IN 需要 4 分钟,使用 ANY 需要 1 秒。您也可以使用 ANY ARRAY 而不是 ANY VALUES,但根据我的阅读,这比 ANY VALUES 慢。