Эффективно ли иметь 90 процентов строк с полем NULL?

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

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

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

4 ответа

Решение

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

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

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

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

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

Обновление:

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