postgresql - PostgreSQL多列索引最佳实践?
问题描述
下面是我的表格脚本。
CREATE TABLE tbloom AS
SELECT
(random() * 100)::int as i1,
(random() * 1000)::int as i2,
(random() * 10000)::int as i3,
(random() * 100000)::int as i4,
(random() * 1000000)::int as i5,
(random() * 10000000)::int as i6,
(random() * 50000000)::int as i7
FROM
generate_series(1,300000000);
下面是我的索引脚本
CREATE index btreeidx ON tbloom (i1, i2, i3, i4, i5, i6,i7);
以下是我的选择查询
select * from tbloom where i1=55 and i2=119 and i3=2196 limit 20;
执行时需要超过 1 分 30 秒。如何优化查询时间,为此建议使用哪个索引?在我的应用程序中,用户可以选择任意组合的数据选择,这意味着用户可以像这样查询 i2,i3 或 i4,i6。请建议我正确的方法...
注意: 我用单列创建了索引。它在 300 毫秒到 700 毫秒内给出结果,但根据我的要求,用户可以选择任何列(1 或 2 或所有列)
解决方案
您展示的示例绝对应该使用索引,因为WHERE
子句中使用了前三个索引列。
但是表和索引的名称以及您的评论
根据我的要求,用户可以选择任何列(1 或 2 或所有列)
让我假设您实际上想要一个绽放指数。
为此,您必须bloom
在数据库中定义扩展名:
CREATE EXTENSION bloom;
并用 定义索引USING bloom
:
CREATE index btreeidx ON tbloom USING bloom (i1, i2, i3, i4, i5, i6, i7);
然后可以在WHERE
条件中任意组合使用索引列,索引就可以使用了。
推荐阅读
- ios - Unity Firebase iOS 缺少符号 arm64
- java - 在 ArrayList 中为现有条目设置值
- java - 即使在实现 onSaveInstanceState() 和 onRestoreInstanceState() 方法后也无法保存我的活动状态
- php - 如何生成用于在线票务服务的安全且唯一的令牌?
- vue.js - 如何通过动态道具
- javascript - 添加新形状后画布不渲染形状
- django - 如何在 django 中创建一个具有多个模型之一的外键的模型?
- jquery - 在悬停时显示元素延迟
- java - 如何在另一个应用程序模块中使用项目源代码
- sql - 在 UPDATE 查询中使用 IN 子句的语法错误