我有一个用户表,在其中我将有很多用户名搜索,即。

WHERE username LIKE 'xxx%'

以下是我的测试数据库的结构:
CREATE TABLE usernames
(
  id serial NOT NULL,
  username character varying(64),
  name character varying(64)
)

我插入了一百万个不同的ish名称和用户名。然后,我尝试查找名称和用户名,但没有为两个列创建索引—查询的平均次数:
SELECT * FROM usernames WHERE username LIKE 'xxx%'

是650ms。之后,我使用以下命令创建了用户名列的索引:
CREATE INDEX usernames_lower_idx
  ON usernames
  USING btree
  (lower(username::text)

同样的,平均650ms,我尝试了使用和不使用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"

最佳答案

create index usernames_idx on usernames (username varchar_pattern_ops);

analyze usernames;

10-07 17:55