PostgreSQL LIKE查询性能变化
我已经看到相当大的变化响应时间LIKE查询到我的数据库中的特定表。有时我会得到200-400毫秒(非常可接受)的结果,但其他时候,可能需要30秒的时间才能返回结果。
我知道LIKE查询是非常资源密集,但我只是不明白为什么会有这么大的响应时间的差异。我已经在owner1字段上构建了一个btree索引,但我不认为它有助于LIKE查询。任何人都有什么想法? 示例SQL: SELECT gid,owner1 FORM parcels WHERE owner1 ILIKE '%someones name%' LIMIT 10 我也试过: SELECT gid,owner1 FROM parcels WHERE lower(owner1) LIKE lower('%someones name%') LIMIT 10 和: SELECT gid,owner1 FROM parcels WHERE lower(owner1) LIKE lower('someones name%') LIMIT 10 结果类似。
FTS不支持LIKE
previously accepted answer不正确。 Full Text Search及其全文索引不是为LIKE操作符,它有自己的操作符,不适用于任意字符串。它运行于基于词典和词干的词。它支持字词的前缀匹配,但不支持LIKE运算符: > Get partial match from GIN indexed TSVECTOR column LIKE的Trigram索引 安装附加模块 示例索引: CREATE INDEX tbl_col_gin_trgm_idx ON tbl USING gin (col gin_trgm_ops); 要么: CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops); > Difference between GiST and GIN index 示例查询: SELECT * FROM tbl WHERE col LIKE '%foo%'; -- leading wildcard SELECT * FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitive as well text_pattern_ops用于前缀匹配 对于刚刚左边锚定的模式(没有前导通配符),你得到一个合适的operator class为btree索引:text_pattern_ops或varchar_pattern_ops的最佳。两个内置功能的标准Postgres,无需额外的模块。类似性能,但指数小得多。 示例索引: CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops); 示例查询: SELECT * FROM tbl WHERE col LIKE 'foo%'; -- no leading wildcard 或者,如果您应该使用’C’语言环境(实际上没有语言环境)运行您的数据库,那么一切都按照字节顺序排序,并且使用默认操作符类执行作业的纯B树索引。 更多详细信息,解释,示例和链接在这些相关的答案在dba.SE: > Pattern matching with LIKE,SIMILAR TO or regular expressions in PostgreSQL (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |