【发布时间】:2020-02-20 22:01:55
【问题描述】:
我对 SQL 完全陌生,我正在尝试加快对非常大的数据的联接查询。我开始添加索引(但说实话,我对它们没有深入的了解)并且没有看到太大的变化,我决定在一个更简单的模拟示例上进行基准测试。我在 MacOS 10.14.6 上使用 PostgreSQL 11.5 的 psql 接口。数据服务器本地托管在我的计算机上。第一次发布有关 SQL 的信息,我很抱歉缺少相关信息。
数据库的结构
我创建了两个最初相同的数据库,db 和 db_idx。我从来没有在 db 中的表上放置任何索引或键,而我尝试在 db_idx 中的表上放置索引和键。然后我分别在 db 和 db_idx 中运行简单的连接查询并比较性能。具体来说,db_idx 由两个表组成:
- 具有 100,000 行的客户端表和以下结构:
Table "public.client"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
client_id | integer | | not null |
client_name | text | | |
Indexes:
"pkey_c" PRIMARY KEY, btree (client_id)
- 具有 70,000 行和以下结构的 client_additional 表:
Table "public.client_additional"
Column | Type | Collation | Nullable | Default
------------+---------+-----------+----------+---------
client_id | integer | | not null |
client_age | integer | | |
Indexes:
"pkey_ca" PRIMARY KEY, btree (client_id)
"cov_idx" btree (client_id, client_age)
client_additional 表中的 client_id 列包含客户端的 client_id 值的子集。请注意主键和我在 client_additional 上创建的其他索引。我认为这些会提高基准查询速度(见下文),但事实并非如此。
重要的是,db 数据库完全相同(相同的结构,相同的值),只是它没有索引或键。
旁注: client 和 client_additional 表可能应该是一个表,因为它们在完全相同的级别(客户端级别)提供信息。然而,我在现实生活中使用的数据库的结构是这样的:一些表被“主题”分成几个表,尽管它们提供相同级别的信息。我不知道这对我的问题是否重要。
基准查询
我正在使用以下查询,它模仿了很多我需要对真实数据执行的操作:
SELECT
client_additional.client_id,
client_additional.client_age,
client.client_name
FROM client
INNER JOIN client_additional
ON client.client_id = client_additional.client_id;
基准测试结果
在这两个数据库上,基准查询大约需要 630 毫秒。删除 db_idx 中的键和/或索引不会改变任何内容。这些基准测试结果适用于更大的数据量:索引和非索引情况下的速度相同。
这就是我所在的地方。我如何解释这些结果?我可以提高加入速度吗?如何提高?
【问题讨论】:
标签: sql postgresql performance join