PostgreSql like 不走索引
在PostgreSQL中,当使用LIKE关键字进行模糊查询时,如果模糊查询的表达式不是以通配符开始的,那么索引可能不会被使用,因为大多数数据库引擎实现了最左前缀索引匹配策略,这意味着索引只能从左侧开始使用。
例如,如果你有一个索引在列name
上,查询WHERE name LIKE 'John%'
将会使用索引,但WHERE name LIKE '%John'
不会使用索引。
解决方法:
- 如果可能,重写查询,使模糊匹配从左侧开始。
- 考虑使用全文搜索功能(如
pg_trgm
扩展提供的gist
和gin
索引类型),它们可以更有效地处理不遵循最左前缀的模糊查询。 - 如果模糊查询必须从中间或右侧开始,可以考虑使用函数索引,例如使用
pg_trgm
扩展中的similarity
函数来创建一个函数索引,但这种方法通常不会像普通B-Tree索引那样高效。
示例代码:
-- 假设表名为my_table,列名为my_column
-- 创建pg_trgm扩展
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- 创建一个函数索引
CREATE INDEX my_table_my_column_similarity_idx ON my_table
USING gin (similarity(my_column, 'search_pattern'));
-- 使用函数索引进行查询
SELECT * FROM my_table WHERE similarity(my_column, 'search_pattern') > 0.5;
请注意,函数索引通常比普通的B-Tree索引慢,因为它们需要额外的处理来维护索引数据。在实际使用中,应当根据具体情况和性能需求来选择最合适的解决方案。
评论已关闭