我有一个非常大的表,有100M +行。我试图找到一种更快的方法来执行以下操作。
查询:
SELECT *
FROM "public".example
WHERE a = "foo" and b = "bar"
order by c /* could be any of fields c to z */
limit 100;
这是我现在设置的表和索引。
表:
索引:
"example_multi_idx" btree (a, b)
"c_idx" btree (c)
思想:
c
排序,则"example_multi_idx_with_c" btree (a, b, c)
的索引执行得非常好。但是,如果我按照各种方式进行排序,那么我需要创建n个多键索引,这看起来很浪费。答案 0 :(得分:2)
对于此查询:
defmodule QuickSort do
def sort([]) do
[]
end
def sort(l) do
[head | tail] = l
{l1, l2} = partition(head, tail)
sort(l1) ++ [head] ++ sort(l2)
end
def partition(pivot, rest) do
lesser = Enum.filter(rest, fn(x) -> x < pivot end)
greater = Enum.filter(rest, fn(x) -> x >= pivot end)
{lesser, greater}
end
end
最佳指数为SELECT *
FROM "public".example
WHERE a = "foo" and b = "bar"
order by c /* could be any of fields c to z */
limit 100;
。 Postgres应该能够使用索引进行排序。
如果您希望example(a, b, c)
有多个可能的列,则每个列都需要一个单独的索引。
答案 1 :(得分:1)
按a
和b
过滤后的群组有多大?虽然在索引中包含c
肯定会有助于提高性能,但如果您的组不是特别大,那么操作结束时的排序不应该花费很多。
您当前的索引存在性能问题吗?