Postgres WHERE和SORT BY优化

时间:2018-01-25 18:29:18

标签: sql postgresql

我有一个非常大的表,有100M +行。我试图找到一种更快的方法来执行以下操作。

查询:

SELECT *
FROM "public".example
WHERE a = "foo" and b = "bar"
order by c /* could be any of fields c to z */
limit 100;

这是我现在设置的表和索引。

表:

  • ID
  • a(字符串)
  • b(字符串)
  • c ... z(所有整数)

索引:

"example_multi_idx" btree (a, b)
"c_idx" btree (c)

思想:

  • 如果我只按c排序,则"example_multi_idx_with_c" btree (a, b, c)的索引执行得非常好。但是,如果我按照各种方式进行排序,那么我需要创建n个多键索引,这看起来很浪费。

2 个答案:

答案 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)

ab过滤后的群组有多大?虽然在索引中包含c肯定会有助于提高性能,但如果您的组不是特别大,那么操作结束时的排序不应该花费很多。

您当前的索引存在性能问题吗?