使用索引加速左锚定查询?

时间:2013-06-25 15:10:09

标签: sql database postgresql

我有一个用户表,我将在其中进行大量的用户名搜索,即

WHERE username LIKE 'xxx%'

这是我的测试数据库的结构:

CREATE TABLE usernames
(
  id serial NOT NULL,
  username character varying(64),
  name character varying(64)
)

我插入了一百万个不同的名字和用户名。然后我尝试搜索名称和用户名而不创建两个列的索引 - 查询的平均时间:

SELECT * FROM usernames WHERE username LIKE 'xxx%'

是650毫秒。之后,我使用以下方法为用户名列创建了索引:

CREATE INDEX usernames_lower_idx
  ON usernames
  USING btree
  (lower(username::text)

时间再次平均为650毫秒。我尝试使用和不使用lower函数,结果相同。任何想法如何加快速度(不使用外部搜索引擎)?我正在使用PostgreSQL 9.2。

编辑1:

"Seq Scan on usernames  (cost=0.00..24437.47 rows=95 width=64) (actual time=609.796..609.796 rows=0 loops=1)"
"  Filter: ((username)::text ~~ 'asd%'::text)"
"  Rows Removed by Filter: 998358"
"Total runtime: 609.897 ms"

1 个答案:

答案 0 :(得分:4)

create index usernames_idx on usernames (username varchar_pattern_ops);

analyze usernames;