我的查询如下:
SELECT *
FROM my_table
WHERE 'some_string' LIKE mytable.some_column || '%%'
如何索引 some_column 列以提高此查询性能? 或者它是一种更好的过滤方法吗?
答案 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';
在这种情况下,索引基本上没用,因为我们不知道列值应该从哪个前缀开始。