【发布时间】:2018-03-05 19:24:10
【问题描述】:
这是我非常简化的业务需求(使用 PostgreSQL 10.1):
有两个表order 和customer 使用join 一起从db 中检索。两个表都包含必须使用ILIKE 关键字进行过滤的字段。然后我有两个gin 索引来提高查询性能:
CREATE INDEX order_type ON orderd USING gin (type gin_trgm_ops);
CREATE INDEX customer_name ON customer USING gin (name gin_trgm_ops);
现在我希望我的查询如下所示:
SELECT * FROM orderd o JOIN customer c ON c.id=o.customer_id
WHERE o.type ILIKE '%user_query%' OR c.name ILIKE '%user_query%';
我希望它使用索引,但EXPLAIN ANALYZE 显示了一些不同的东西。以下是我经过多次试验后的观察结果:
- 如果我尝试使用单一条件,没有
OR,它可以工作(使用索引) - 如果我将
OR替换为AND- 它可以工作 - 如果我在同一个表上有两个索引,它可以工作(
OR和AND)
但是,如果我想使用来自不同表和OR 条件的索引,它似乎无法工作。这是为什么?有什么办法让它工作吗?
我的实际业务场景要复杂的多,有两个以上的表和两个以上的字段,还有其他的过滤器,还有一些在查询中计算出来的统计信息,所以我必须在单个查询中实现所有的过滤。有什么想法可以做到吗?
【问题讨论】:
标签: sql postgresql indexing