sql - 有什么方法可以加快 PostgreSQL 中的“foo%”查询?
问题描述
我有很多疑问,比如
select * from table where (upper (column1) like 'FOO%')
and (upper (column2) like 'BAR%')
and (upper (column3) like 'XYZ%')
还有这样一个索引:
create index on table (upper(column1::text), upper(column2::text), upper(column3::text));
但是由于某种原因查询非常慢,并且解释运算符显示它不使用任何索引扫描,只是简单的秒扫描。我读过 B-tree 索引类型最适合像我这样在常量末尾带有锚点的查询。任何想法为什么会发生这种情况?我的索引创建命令可能有问题吗?
解决方案
为此,您需要三个索引:
/* "text_pattern_ops" makes the index usable for LIKE */
CREATE INDEX ON "table" (column1 text_pattern_ops);
CREATE INDEX ON "table" (column2 text_pattern_ops);
CREATE INDEX ON "table" (column3 text_pattern_ops);
PostgreSQL 将扫描一个或多个索引以寻找WHERE
可以显着减少行数的条件。如果它扫描多个索引,它可以组合结果。如果这些WHERE
条件之一从不具有选择性,则可以省略相应的索引,因为它不会被使用。
您将无法使用单个索引覆盖该查询。
推荐阅读
- json - JSON HAL - 为链接指定不同的格式
- react-native - 如何在本机反应中更改底部选项卡导航器样式
- authentication - ASP.NET Core:Cookie 未经过身份验证。失败消息:取消保护票证失败
- reactjs - React Native - 如何防止重新渲染“静态”组件
- javascript - 我可以使用 Discord API 在消息请求中保存信息吗?
- haskell - 有人可以解释这个 Haskell 问题吗?
- android - 搜索/过滤分页列表
- php - 用于 Nginx 和 php-fpm 的 Kubernetes Docker 上的连接错误
- firefox - 语音合成 API 在 Manjaro 上的 Firefox 中不起作用
- reactjs - Apollo Client 3 - 全局事件监听器?