Postgresql模式匹配性能

时间:2017-10-18 14:58:09

标签: postgresql indexing

我的查询如下:

SELECT *
FROM my_table
WHERE 'some_string' LIKE mytable.some_column || '%%'

如何索引 some_column 列以提高此查询性能? 或者它是一种更好的过滤方法吗?

2 个答案:

答案 0 :(得分:1)

此谓词有效地搜索给定字符串的所有前缀:

WHERE 'some_string' LIKE mytable.some_column || '%'

也许%是您客户端中的特殊字符,需要使用其他%进行转义以传递文字%,否则'%%'只会是噪音可以替换为'%'

最有效的解决方案应该是一个递归的CTE(或类似的),它与每个前缀完全匹配,从some_column = left('some_string', 1)开始,最多some_column = left('some_string', length('some_string'))(= 'some_string')。

您只需在列上使用普通的btree索引。根据实现的细节,部分表达式索引可能会提高性能......

相关:

答案 1 :(得分:0)

我相信你打算写下面的查询:

SELECT *
FROM my_table
WHERE mytable.some_column LIKE 'some_string%';

换句话说,您希望查找某些列以some_string开头,后跟任何内容的记录,可能一无所有。

据我所知,some_column上的常规B树索引在查询中的某个点上是有效的。原因是Postgres可以遍历树寻找前缀some_string。一旦找到该条目,超出该条目可能无济于事。但some_column上的索引应该会给你带来一些性能上的好处。

索引帮助的条件如下:

WHERE mutable.some_column LIKE '%some_string';

在这种情况下,索引基本上没用,因为我们不知道列值应该从哪个前缀开始。