关于LIKE
查询数据库中特定表的响应时间,我看到了相当大的变化.有时我会在200-400毫秒内得到结果(非常可接受),但有时候返回结果可能需要30秒.
我知道LIKE
查询是非常耗费资源的,但我只是不明白为什么响应时间会有这么大的差异.我已经在该owner1
字段上构建了一个btree索引,但我认为这对LIKE
查询没有帮助.有人有主意吗?
示例SQL:
SELECT gid, owner1 FORM parcels
WHERE owner1 ILIKE '%someones name%' LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('%someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)
和:
SELECT gid, owner1 FROM parcels
WHERE lower(owner1) LIKE lower('someones name%') LIMIT 10
Run Code Online (Sandbox Code Playgroud)
有类似的结果.
表行数:约95,000.
postgresql indexing query-optimization pattern-matching sql-like
表示不同类型事件(音乐会,足球比赛,慈善机构等)的SQL数据库,其中每个都包含与事件相关的数据(音乐会 - 艺术家姓名,匹配 - 主持人/访客团队).所有这些事件都从一个通用表继承event
,该表包含与所有这些事件相关的数据(名称,描述,位置,开始/结束日期).使用Hibernate或Doctrine中已知的table-per-subclass模型实现继承.该数据库还存储表artists
(id
,name
,birth_date
)和football_teams
(id
,name
,country
,coach_name
)在使用event_concerts
和event_football_matches
表(通过FKS).
创建一个给定一些标准({name: "manchester", startDate: "01.01.2012 - 01.02.2012"}
或{location: "london", description: "artists +metallica -bieber"}
)的搜索引擎将返回符合条件的所有事件,以及artists
/ football_teams
tables的结果.
这些事件的某些属性包含大量文本,应以全文搜索方式进行搜索.
根据以下搜索条件:
{ location: "london", startDate: "05.11.2012 - 07.11.2012" }
Run Code Online (Sandbox Code Playgroud)
搜索引擎应返回:
如您所见,仅在事件发生时才考虑startDate(与事件相关的属性). …
用户可以键入名称,系统应与文本匹配,即使用户输入或数据库字段包含重音(UTF-8)字符也是如此.这是使用该pg_trgm
模块.
代码类似于以下内容:
SELECT
t.label
FROM
the_table t
WHERE
label % 'fil'
ORDER BY
similarity( t.label, 'fil' ) DESC
Run Code Online (Sandbox Code Playgroud)
当用户键入时fil
,查询匹配filbert
但不匹配filé powder
.(因为重音字符?)
我试图实现一个unaccent函数并将查询重写为:
SELECT
t.label
FROM
the_table t
WHERE
unaccent( label ) % unaccent( 'fil' )
ORDER BY
similarity( unaccent( t.label ), unaccent( 'fil' ) ) DESC
Run Code Online (Sandbox Code Playgroud)
这只返回filbert
.
建议:
CREATE EXTENSION pg_trgm;
CREATE EXTENSION unaccent;
CREATE OR REPLACE FUNCTION unaccent_text(text)
RETURNS text AS
$BODY$
SELECT unaccent($1); …
Run Code Online (Sandbox Code Playgroud) postgresql ×2
indexing ×1
performance ×1
plpgsql ×1
search ×1
similarity ×1
sql-like ×1
utf-8 ×1