Проектирование базы данных MySQL с разреженным столбцом - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть таблица (миллионы строк), где один из столбцов является текстовым полем (хранит капли json).Но только около 10-20% из них на самом деле ненулевые.Какова лучшая практика, когда дело доходит до разреженных столбцов?Должен ли я

a) Просто сохранить таблицу как есть или

b) Создать новую таблицу только с этим столбцом текста?

Если я не ошибаюсь, вариант (a) хорошо, потому что InnoDB будет динамически выделять столько места, сколько нужно для этого столбца Text, верно?Есть ли причина использовать вариант (b)?Похоже, опция (b) просто добавит сложности при запросе (объединении) этих таблиц и еще больше увеличит сложность пространства.

Ответы [ 3 ]

0 голосов
/ 15 сентября 2018

Вы упомянули вопрос хранения / пространства.Я думаю, что самое главное, как вы будете использовать данные.Если вы не согласны с выполнением подобного "%% соответствия", просто оставьте его.

Денормализация данных позволит вам лучше запрашивать / индексировать содержимое.

0 голосов
/ 01 октября 2018

В общем, не имеет значения, делаете ли вы (а) или (б). Но вот еще несколько соображений:

  • Если вы делаете SELECT *, но игнорируете этот столбец, то (a) расточительно.
  • Некоторые InnoDB ROW_FORMATs помещают в таблицу «короткие» строки, а не отдельные; другие будут хранить их в отдельном блоке, оставляя позади 20 или 767 байт в главном блоке. (Это становится довольно утомительным и запутанным, чтобы увидеть, будет ли это действительно иметь значение для (а).)
  • (b) включает в свой код LEFT JOIN, когда вы хотите столбец. Вы можете считаете это беспокойством.
0 голосов
/ 14 сентября 2018

MySQL (механизм хранения InnoDB) ничего не хранит для NULL.Ну, у каждой строки есть битовое поле с 1 битом для каждого обнуляемого столбца.За битовым полем следуют значения данных для столбцов, отличных от NULL.А столбцы переменной длины, такие как VARCHAR, TEXT, BLOB или JSON, занимают только необходимое пространство, учитывая их длину.

Поэтому я бы посоветовал оставить таблицу как есть, оставить поле TEXT в таблице и сделатьNULL, когда нет данных JSON.

PS: Вы не используете тип данных JSON ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...