查询匹配字符串标记

时间:2014-06-14 01:31:29

标签: sql postgresql

假设我在SQL中有数百万行,使用PostgreSQL进行查询。 每行包含字符串~~~&AA=~~~或不包含。 在所有行中,我需要获取CONTAINS AA=的行。

那么查询这个的最佳方式是什么?

我尝试了以下但是速度非常慢。

SELECT my_column
FROM table
WHERE my_column 
    LIKE '%AA=%' 

我应该使用什么?

3 个答案:

答案 0 :(得分:2)

您需要找出制作索引的方法或使用其他类似搜索引擎的方法。

首先看看为什么LIKE can be slow in postgresl and how to make i faster at use-the-index-luke。基本上它归结为使用special index functions或考虑使用Postgresql Fulltext Search Support

另外,从您的问题中不清楚每一行是否实际包含内容~~~&AA=~~~,那么为什么不只是WHERE my_column = '~~~&AA=~~~'?如果是这种情况,您可以轻松地为~~~&AA=~~~创建部分索引,因为Postgresql支持部分索引。

答案 1 :(得分:1)

在处理LIKE表达式时,Postgres只能在第一个通配符之前使用btree索引(默认索引类型)。因此,对于类似my_col LIKE 'ABC%XYZ'的内容,它可以在索引中搜索以'ABC'开头的字符串。当通配符是第一个字符时,它根本不能使用索引。

正如Adam Gent指出的那样,如果你想寻找任意的子串,那么你需要额外的数据结构来支持全文搜索,这绝非易事。

但是,如果您一直在寻找'AA=',并且如果您经常这样做,则可以专门为此查询创建索引,即

CREATE INDEX ON my_table ((my_column LIKE '%AA=%'))

答案 2 :(得分:0)

您的查询可能是您可以为您想要获取的数据编写的最佳查询。您可以尝试加速查询的一件事是索引您正在搜索的列。如果字段的数据类型允许您存储大量数据,则这可能不是最佳解决方案。否则,如前所述,如果它更像是您要查找的静态文本,您可以在行中为您感兴趣的数据设置标记。