每行中有太多空字段会影响 PostgreSQL 中的搜索性能吗?
Posted
技术标签:
【中文标题】每行中有太多空字段会影响 PostgreSQL 中的搜索性能吗?【英文标题】:Does too many empty fields in each row effect search performance in PostgreSQL? 【发布时间】:2020-06-24 14:59:53 【问题描述】:我使用 PostgreSQL 作为我的数据库以及 Django
下面是我的数据库模型
class Users(model.Model):
email = model.CharField(max_length=50, default="")
password = model.CharField(max_length=40, default="")
source = model.CharField(default='unknown', max_length=150)
domain = model.CharField(max_length=50, default="")
before_at = model.CharField(max_length=255, default="")
username = model.CharField(max_length=150, default="")
hash = model.CharField(max_length=255, default="")
ipaddress = model.CharField(max_length=50, default="")
phonenumber = model.CharField(max_length=100, default="")
class Meta:
constraints = [
models.UniqueConstraint(fields=['email', 'password', 'source'], name='uniqueness constraints')
]
def __str__(self):
return self.email
问题是大多数行将包含电子邮件、密码、域字段,但其余行将保持为空。 同样,有些会有用户名、密码、来源,而有些则为空。 我想要做的是每个人都可以根据不同的字段(例如电子邮件、密码、域、用户名、哈希、IP 地址)从用户表中进行搜索。这张表中将有 数十亿 条数据。 所以最好的做法是即使行有很多空字段也可以,或者它会影响性能。例如,总共有 10 亿条记录,但其中有 50 亿条记录有空/空 ipaddress 字段,而有 50 亿条记录在 ipaddress 字段中有数据,那么如果我根据 ipaddress 字段在表中搜索是否会影响搜索性能与否。
有没有更好的方法来做到这一点,比如拆分表格或其他任何事情?
谢谢
【问题讨论】:
阅读thread。应该给你一个很好的理解。 这能回答你的问题吗? PostgreSQL: performance impact of extra columns 【参考方案1】:表定义后面的列需要更长的时间才能访问。对于 9 列,这不太可能有意义,但对于 200 列可能有意义。
跳过一个空列到达您想要的那个需要一些时间,但跳过一个占用的列也是如此。
可能最可能为 NULL 的列最不可能被搜索,因此在表定义的末尾声明它们是有意义的。
这是过早的优化。如果你真的很担心,可以想出一个数据生成器来生成真实数据,并针对真实数据运行真实查询的实际测试。
【讨论】:
以上是关于每行中有太多空字段会影响 PostgreSQL 中的搜索性能吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在春季测试中使用 liquibase 解决“已经有太多客户”的问题?
Arval SQLException: FATAL: 抱歉,postgres 中已经有太多客户端