Sql Postgres WHERE和按优化排序
我有一张100多行的大桌子。我试图找出是否有一种更快的方法来执行以下内容 查询:Sql Postgres WHERE和按优化排序,sql,postgresql,Sql,Postgresql,我有一张100多行的大桌子。我试图找出是否有一种更快的方法来执行以下内容 查询: SELECT * FROM "public".example WHERE a = "foo" and b = "bar" order by c /* could be any of fields c to z */ limit 100; 这是我现在设置的表和索引 表: 身份证 a(字符串) b(字符串) c。。。z(所有整数) 索引: "example_multi_idx" btree (a, b) "c_i
SELECT *
FROM "public".example
WHERE a = "foo" and b = "bar"
order by c /* could be any of fields c to z */
limit 100;
这是我现在设置的表和索引
表:
- 身份证
- a(字符串)
- b(字符串)
- c。。。z(所有整数)
"example_multi_idx" btree (a, b)
"c_idx" btree (c)
想法:
- 如果我只是按
排序,那么c
执行得非常出色。然而,如果我加入各种排序方式,那么我将需要创建n个多键索引,这似乎是浪费的索引“example\u multi\u idx\u with_c”b树(a,b,c)
SELECT *
FROM "public".example
WHERE a = "foo" and b = "bar"
order by c /* could be any of fields c to z */
limit 100;
最佳索引是示例(a、b、c)
。Postgres应该能够使用索引进行排序
如果要为排序依据设置多个可能的列,则需要为每个列设置单独的索引。按
a
和b
筛选后,组有多大?虽然在索引中包含c
肯定会有助于提高性能,但如果您的组不是特别大,那么在操作结束时进行排序应该不会有很大的成本
您当前的索引是否存在性能问题?我同意,但是,如果有N个order by选项(如我在上一个要点中指出的)如何?为每种可能性创建多键索引似乎都是浪费。但是,除非有子查询或其他花哨的步法可以完成,否则这可能就是它的方式?@nakkor。如果您希望为每个条件使用索引,那么这是您唯一的选择。对相对少量的数据进行排序不应花费太长时间。因此,如果其他条件是高度选择性的,您可以让Postgre进行排序。结果集小于10k。分析的排序成本似乎在200ms左右,而完整索引的排序成本为1ms。我希望在这两者之间找到一个好的解决方案,它不会因为每个多索引一遍又一遍地重复a和b而导致索引大小的巨大膨胀。