Влияет ли слишком много пустых полей в каждой строке на производительность поиска в PostgreSQL? - PullRequest
0 голосов
/ 12 марта 2020

Я использую 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

Дело в том, что в большинстве строк будет электронная почта, пароль, поле домена, но остальное останется пустым. Точно так же у некоторых будет имя пользователя, пароль, источник, в то время как другие пусты. Что я хочу сделать, так это то, что каждый может искать из таблицы пользователей по разным полям, таким как электронная почта, пароль, домен, имя пользователя, ha sh, ipaddress. В этой таблице будет миллиардов данных. Так что лучше всего, если в строках много пустых полей или это влияет на производительность. Например, всего существует один миллиард записей, но в которых полмиллиарда имеют пустое / нулевое поле ipaddress, а полмиллиарда записей имеют данные в поле ipaddress, тогда, если, если я буду искать в таблице на основе поля ipaddress, это повлияет на производительность поиска или нет.

Есть ли лучший способ сделать это, например, разделить стол или что-то еще?

спасибо

1 Ответ

0 голосов
/ 12 марта 2020

Столбцы позже в определении таблицы требуют больше времени для доступа. Для 9 столбцов это маловероятно, но для 200 столбцов это может быть.

Пропуск пустого столбца для перехода к нужному столбцу занимает некоторое время, но пропуск занятого столбца тоже хорошо.

Предположительно, столбец с наибольшей вероятностью NULL будет наименее вероятным для поиска, поэтому имеет смысл объявить их в конце определения таблицы.

Это преждевременная оптимизация , Если вы действительно обеспокоены, придумайте генератор данных, который генерирует реалистичные данные c, и запустите реальные тесты реалистичных c запросов против реалистичных c данных.

...