【发布时间】:2017-09-19 13:28:49
【问题描述】:
给出了下表:
--- player --
id serial
name VARCHAR(100)
birthday DATE
country VARCHAR(3)
PRIMARY KEY id
--- club ---
id SERIAL
name VARCHAR(100)
country VARCHAR(3)
PRIMARY KEY id
--- playersinclubs ---
id SERIAL
player_id INTEGER (with INDEX)
club_id INTEGER (with INDEX)
joined DATE
left DATE
PRIMARY KEY id
每个玩家在桌面玩家中都有一行(带有他的属性)。同样,每个俱乐部在桌面俱乐部都有一个条目。 对于他职业生涯中的每个站点,球员在表 playerInClubs (n-m) 中都有一个条目,其中包含球员加入的日期以及球员离开俱乐部的时间。
我的主要问题是这些表的性能。在 Table player 中,我们有超过 1000 万个条目。如果我想显示一个俱乐部的历史,他的所有球员都为这个俱乐部效力,我的选择如下所示:
SELECT * FROM player
JOIN playersinclubs ON player.id = playersinclubs.player_id
JOIN club ON club.id = playersinclubs.club_id
WHERE club.dbid = 3;
但是对于大量玩家来说,将在桌面玩家上执行序列扫描。此选择需要很长时间。
在我为我的应用程序实现一些新功能之前,每个玩家都只有一支球队(仅限今天的球队和球员)。 所以我还没有桌球员俱乐部。相反,我在桌面播放器中有一个 team_id。我可以使用 where 子句 team_id = 3 在 table player 中直接选择一个团队的球员。
有人对我的数据库结构有一些性能提示以加快这些选择吗?
【问题讨论】:
-
请Edit您的问题并添加使用
explain (analyze, verbose)生成的执行计划。 Formatted text 请no screen shots -
您还想对
playersinclubs{player,date_joined+left}进行日期范围限制吗?顺便说一句:你真的不需要桥接表上的代理键。 -
缺少基本信息。考虑 [postgresql-performance] 标签信息中的说明。
-
那么你有答案了吗?
-
我已经添加了索引playersinclubs(club_id, player_id),但是性能差不多。也许没有办法提高此数据表的性能?...
标签: postgresql indexing many-to-many postgresql-performance