每行中有太多空字段会影响 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 中的搜索性能吗?的主要内容,如果未能解决你的问题,请参考以下文章

错误:抱歉,已经有太多客户了

数量、大小、长度……Ruby 中有太多选择?

如何在春季测试中使用 liquibase 解决“已经有太多客户”的问题?

Arval SQLException: FATAL: 抱歉,postgres 中已经有太多客户端

一个 If 语句,用于查找数字字段是不是留空或有太多小数位,但如果小数位只有零则忽略

为什么不建议函数有太多参数?