【发布时间】:2018-08-26 19:40:14
【问题描述】:
我有一个相当大的表,其中最常见的 API 请求是这样的:
/api/orders?status=confirmed
为服务该请求而生成的实际 SQL 类似于:
SELECT * FROM orders
WHERE account_id = 'X' AND status = 'confirmed' AND versionID IS NULL
ORDER BY int_id;
在我的一生中,我无法弄清楚在 postgres 9.5.4 上运行的索引会使其表现得非常好。
我在(account_id, status, versionID) 上创建了一个索引,这使得在同一个查询中减去ORDER BY(它使用“仅索引扫描”),事情变得非常快,但是一旦ORDER BY 在那里,它就会恢复回到“位图堆扫描”和“位图索引扫描”的组合,速度要慢 50-100 倍。
我还尝试在(int_id ASC, account_id, status, versionID) 上创建索引,查询规划器似乎完全忽略了它。
关于如何使用“仅索引扫描”或同等快速的方法构建将服务于完整查询的索引的任何想法?
【问题讨论】:
-
你确定这是完整的故事吗?你能发布一些架构吗?我似乎无法复制您的问题:
create table orders (orders_id serial primary key, account_id text not null, status text not null, version_id int null); insert into orders (account_id, status, version_id) select generate_series(1, 100000), 'confirmed', null; SELECT * FROM orders WHERE account_id = '1' AND status = 'confirmed' AND version_id IS NULL ORDER BY orders_id;给了我一个仅索引扫描。
标签: sql postgresql indexing