PostgreSQL 唯一索引性能
PostgreSQL Unique Index performance
我有一个脚本可以对新闻进行网络抓取,然后将我抓取的信息上传到 RDS 中的 PostgreSQL 数据库中。我的问题是关于确保同一篇新闻文章不会被多次记录的首选方法。
每次我抓取时,网络抓取器 returns 40 篇新闻文章。我设置了它,以便将每篇文章 + 标题添加到 table,其中标题列具有 UNIQUE 键约束。所以为了保证每篇文章只记录一次,我有2个选项:
- 使用简单的 try and except 尝试将每篇文章 + 标题插入 table -- 如果标题已存在但被忽略,则返回错误。
- 或者,我可以在数据库中查询最近添加的 40 篇文章,将它们的标题与我提取的文章进行比较,然后只插入那些不在数据库中的文章。
我的问题是:哪个更好performance-wise?我的猜测是,如果文章数量较少,1 号会更好,但随着文章数量的增加,使用 2 号会更好,对吗?
- 创建一个临时 table,与 目标 table
相同
- 将您抓取的文章放入此临时文件
- [从此临时删除重复项]
- 将临时 table 中的记录插入实际 table,但仅插入尚不存在的记录
下面是我的推特抓取的片段:
ins2 = """INSERT INTO tweets(id,sucker_id,created_at,user_id
,in_reply_to_id,is_reply_to_me,is_retweet,body)
SELECT tt.id,tt.sucker_id,tt.created_at,tt.user_id
,tt.in_reply_to_id,is_reply_to_me,is_retweet,tt.body
FROM tt_tweets tt
WHERE NOT EXISTS( SELECT 1 FROM tweets nx where nx.id = tt.id)
;"""
并且:推文有一个数字 ID,这使得重复数据删除变得非常容易。
如果不是以愚蠢的方式完成,则在本地为抓取器识别重复项将比向数据库创建 round-trip 更快。但与首先进行抓取的开销相比,这种差异不太可能有意义。
但是如果抓取工具对标题的记忆力有限,您无论如何都需要 catch-and-ignore 能力。
我有一个脚本可以对新闻进行网络抓取,然后将我抓取的信息上传到 RDS 中的 PostgreSQL 数据库中。我的问题是关于确保同一篇新闻文章不会被多次记录的首选方法。
每次我抓取时,网络抓取器 returns 40 篇新闻文章。我设置了它,以便将每篇文章 + 标题添加到 table,其中标题列具有 UNIQUE 键约束。所以为了保证每篇文章只记录一次,我有2个选项:
- 使用简单的 try and except 尝试将每篇文章 + 标题插入 table -- 如果标题已存在但被忽略,则返回错误。
- 或者,我可以在数据库中查询最近添加的 40 篇文章,将它们的标题与我提取的文章进行比较,然后只插入那些不在数据库中的文章。
我的问题是:哪个更好performance-wise?我的猜测是,如果文章数量较少,1 号会更好,但随着文章数量的增加,使用 2 号会更好,对吗?
- 创建一个临时 table,与 目标 table 相同
- 将您抓取的文章放入此临时文件
- [从此临时删除重复项]
- 将临时 table 中的记录插入实际 table,但仅插入尚不存在的记录
下面是我的推特抓取的片段:
ins2 = """INSERT INTO tweets(id,sucker_id,created_at,user_id
,in_reply_to_id,is_reply_to_me,is_retweet,body)
SELECT tt.id,tt.sucker_id,tt.created_at,tt.user_id
,tt.in_reply_to_id,is_reply_to_me,is_retweet,tt.body
FROM tt_tweets tt
WHERE NOT EXISTS( SELECT 1 FROM tweets nx where nx.id = tt.id)
;"""
并且:推文有一个数字 ID,这使得重复数据删除变得非常容易。
如果不是以愚蠢的方式完成,则在本地为抓取器识别重复项将比向数据库创建 round-trip 更快。但与首先进行抓取的开销相比,这种差异不太可能有意义。
但是如果抓取工具对标题的记忆力有限,您无论如何都需要 catch-and-ignore 能力。