MySQL несколько строк против хранения значений все в одной строке - PullRequest
0 голосов
/ 08 июня 2018

Мне было просто интересно узнать об эффективности хранения большого количества логических значений внутри CHAR или VARCHAR

data
"TFTFTTF"

против

isFoo  isBar isText
false  true  false

Будет ли это стоить худшей производительности?путем переключения хранения этих значений таким образом?Я подумал, что было бы проще просто установить одно значение, а не все остальные поля

спасибо

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

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

Дисковое пространство

С точки зрения использования хранилища не имеет значения, хранятся ли данные в одном столбце varchar(n) или char(n) или в нескольких tinynt, char(1) или bit(1) столбцы.Только при использовании varchar вам потребуется от 1 до 2 байт дискового пространства на каждую запись.

Для получения дополнительной информации о требованиях к хранилищу для различных типов данных см. Документацию MySql .

Производительность запроса

Если бы логические значения были сохранены в VarChar, поиск всех записей, для которых определенное значение равно True, занял бы гораздо больше времени, поскольку строковые операциинеобходимо будет найти правильные записи.Даже при поиске комбинации логических значений, таких как «TFTFTFTFTT», запрос все равно займет больше времени, чем если бы логические значения хранились в отдельных столбцах.Кроме того, вы можете назначать индексы отдельным столбцам, таким как isFoo или isBar, что оказывает большое положительное влияние на производительность запросов.

Модель данных

Модель данных должна быть максимально понятнойнасколько возможно и, если возможно, независимо от каких-либо соображений реализации.

0 голосов
/ 08 июня 2018

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

0 голосов
/ 08 июня 2018

Реально, поле базы данных должно содержать только одно атомарное значение, то есть значение, которое нельзя подразделить на отдельные части.

Столбцы, которые не содержат атомарных значений:

  • не могут быть отсортированы
  • не могут быть сгруппированы
  • не могут быть проиндексированы

Итак, допустим, вы хотите найти все строки, где isFoo истинно, вы не сможете сделать это, если не будете выполнять строковые операции, такие как «найти третьи символы в этой строке и посмотреть, равно ли это»F ". Это будет означать полное сканирование таблицы с каждым запросом, что значительно снизит производительность.

0 голосов
/ 08 июня 2018

Не делай этого.MySQL предлагает типы, такие как char(1) и tinyint, которые занимают то же пространство, что и один символ.Кроме того, MySQL предлагает перечисляемые типы, если вы хотите, чтобы ваши флаги имели более одного значения, и чтобы значения были распознаваемыми.

Эта последняя точка является критической точкой.Вы хотите, чтобы ваш код имел смысл.Строка 'FTF' действительно не имеет смысл.Столбцы isFoo, isBar и isText do имеют смысл.

Нет необходимости запутывать вашу модель данных.

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