其他分享
首页 > 其他分享> > 通过icode9使用 PostgreSQL 进行数据库索引

通过icode9使用 PostgreSQL 进行数据库索引

作者:互联网

索引是提高读取性能的一种方法,但它也会使写入性能变差,因此请考虑根据您的用例在应用程序中使用索引。

为了演示,我将使用 antable 来处理 1000 万条记录:orders

create table orders (
  id serial primary key,
  total integer, -- unit: usd
  user_id integer,
  created_at date
);

然后生成:

total:范围内的随机数 (1 - 10k)

user_id:范围内的随机数 (1 - 100k)

created_at:范围内的随机日期 (2002 - 2022) (20 年)

表应如下所示:orders

 id | total | user_id | created_at
----+-------+---------+------------
  1 |  7492 |    9968 | 2021-03-20
  2 |  3084 |   81839 | 2008-03-20
  3 |  3523 |   85845 | 2018-12-22
  ...

不带索引:

让我们用来查看此查询:explain analyzequery plan

explain analyze select sum(total) from orders
where extract(year from created_at) = 2013;

查询将按照此计划按由内而外的顺序执行:

Finalize Aggregate
└── Gather
    └── Partial Aggregate
        └── Parallel Seq Scan

因此,将与 2 个工人并行进行顺序扫描,然后对于每个工作人员,它将执行 a,然后执行来自工人的结果,然后执行 a。PostgreSQLPartial Aggregation (sum function)GatherFinalized Aggregation (sum function)

在并行 Seq Scan 节点中,它执行 3 个循环,每个循环扫描 3,333,333 行 (= 3,166,526 + 166,807)

要了解如何协同工作,请阅读有关并行聚合和并行序列扫描的更多信息Partial AggregateFinalize Aggregate

带索引:

索引是为特定查询设计的,因此让我们考虑为两个不同查询创建索引的两种方法,但它们具有相同的目的。

在表达式上使用索引:

现在在列上创建一个索引,因为我们在查询上使用表达式,所以我们也需要在索引上使用该表达式(阅读更多关于表达式索引的信息):created_atextract(year from created_at)

create index my_index on orders (extract(year from created_at));

explain analyze select sum(total) from orders
where extract(year from created_at) = 2013;

Aggregate
  └── Bitmap Heap Scan
      └── Bitmap Index Scan

现在它用于扫描,执行时间从(84,22%)减少,这很重要。my_index1441.190ms227.388ms

在列上使用索引:

还有另一种方法可以使用运算符计算2013年订单总值between

explain analyze select sum(total) from orders
where created_at between '2013-01-01' and '2013-12-31';

标签:SQL,数据库,服务器,CPU,环境,网络服务器,SQLServer
来源: