假设我在SQL中有数百万行,使用PostgreSQL进行查询。
每行包含字符串~~~&AA=~~~
或不包含。
在所有行中,我需要获取CONTAINS AA=
的行。
那么查询这个的最佳方式是什么?
我尝试了以下但是速度非常慢。
SELECT my_column
FROM table
WHERE my_column
LIKE '%AA=%'
我应该使用什么?
答案 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)
您的查询可能是您可以为您想要获取的数据编写的最佳查询。您可以尝试加速查询的一件事是索引您正在搜索的列。如果字段的数据类型允许您存储大量数据,则这可能不是最佳解决方案。否则,如前所述,如果它更像是您要查找的静态文本,您可以在行中为您感兴趣的数据设置标记。