Эффективно ли иметь 90 процентов строк с полем NULL? - PullRequest
2 голосов
/ 21 июня 2011

В моем MySQL есть таблица ( InnoDB ), заполненная пользовательскими элементами. В основном каждая строка имеет поле user_id и другие свойства элемента, такие как цвет. Затем есть еще одно поле, называемое ссылкой, которое содержит идентификатор элемента другого пользователя, но в большинстве случаев ( 90% ) нет связанного элемента, и, таким образом, поле установлено на NULL.

Мне было интересно, будет ли эффективнее создать новую таблицу, в которой будет храниться информация о связи, чем 90% из 6 миллионов строк, в которых для ссылки на поле установлено значение NULL * * 1013

Я использую Hibernate.

Ответы [ 4 ]

2 голосов
/ 21 июня 2011

Да, это было бы более эффективно. Это сделало бы очень маленькую разницу.

Лучше всего сделать то, что проще для вас, а затем изменить его, когда это станет реальной проблемой.

1 голос
/ 21 июня 2011

Да, это было бы более эффективно и более нормализовано. Всякий раз, когда я вижу таблицу с множеством таких нулей, я считаю ее кандидатом на нормализацию. В этом примере вы можете полностью удалить этот столбец из таблицы, и он будет намного чище и проще в обслуживании. Вам просто нужно создать соединительную таблицу с двумя user_ids, которые являются внешними ключами в таблице пользовательских элементов.

0 голосов
/ 21 июня 2011

Это займет меньше места. Но если вы выполните (левое) JOIN для каждого запроса, производительность будет хуже ... особенно если у вас много строк, а таблица не помещается в памяти. Затем вам нужно два поиска диска, чтобы получить одну запись.

Обновление

  • JOIN требует дополнительной обработки. Это будет быстро, если у вас есть индексы, но вам все равно придется искать другую запись. И если вы используете InnoDB для поддержки транзакций, база данных должна поддерживать версию для объединенной записи.
  • JOIN плохо влияет на локальность памяти, теперь вам нужно искать запись, которая находится в совершенно другом месте памяти.
  • Как я уже говорил, если данных нет в памяти, вам нужен дополнительный поиск диска. Это действительно плохо.
0 голосов
/ 21 июня 2011

Что касается вашей логики, просто подумайте о хранении только таблиц с данными о связях и кода, который вызывает if, может делать "если не ноль" или эквивалент, чтобы всегда знать, что получить.Не храните все эти нули, если вы можете сделать лучшие предположения

...