每行中有太多的空字段会影响PostgreSQL中的搜索性能吗



我正在使用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亿条记录,但其中5亿条的ipad地址字段为空/空,5亿条记录的ipad地址中有数据,那么如果我在表中基于ipad地址字段进行搜索,是否会影响搜索性能。

有没有更好的方法可以做到这一点,比如拆分桌子或其他任何事情?

感谢

表定义后面的列需要更长的时间才能访问。对于9列,这不太可能有意义,但对于200列,这可能有意义

跳过一个空的列到达你想要的列需要很短的时间,但跳过一个已占用的列也可以。

假设最有可能为NULL的列最不可能被搜索,所以在表定义的末尾声明它们是有意义的。

这是过早的优化。如果你真的很担心,那就设计一个数据生成器,它可以生成真实的数据,并根据真实的数据运行真实查询的实际测试。

最新更新