Хобрук: Ваш путь к мастерству в программировании

Json в mariadb утроил размер хранилища

Я пытаюсь переместить файлы json на основе файлов в mariadb. Приблизительно 2 000 000 файлов json в моей файловой системе заархивированы. Общий объем хранилища для заархивированных файлов json составляет 7 ГБ.

Когда я вставил все записи в Mariadb, хранилище таблицы стало 35 ГБ. я изменил свою таблицу, чтобы она была сжатой, и размер таблицы составляет 15 ГБ. Есть ли способ еще больше уменьшить размер таблицы?

Нормально ли, что хранилище удваивается при добавлении данных в mariadb?

это мой стол

CREATE TABLE `sbpi_json` (
  `fileid` int(11) NOT NULL,
  `json_data` longtext COLLATE utf8_bin NOT NULL,
  `idhash` char(32) COLLATE utf8_bin NOT NULL,
  `sbpi` int(15) NOT NULL,
  `district` int(2) NOT NULL,
  `index_val` int(2) NOT NULL,
  `updated` text COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ROW_FORMAT=COMPRESSED;

ALTER TABLE `sbpi_json`
  ADD PRIMARY KEY (`fileid`),
  ADD UNIQUE KEY `idhash` (`idhash`),
  ADD KEY `sbpi` (`sbpi`);

  • Какова кодировка файлов json в файловой системе? Что такое обновленное поле? 16 ГБ - это место только для данных или оно включает в себя различные файлы журнала MySQL, а также для innodb? 11.09.2019
  • json файлы имеют кодировку UTF-8. обновленное поле используется для дублирования mysql. символы для обновленного поля меньше 10. 11.09.2019
  • Нормально ли, что хранилище удваивается при добавлении данных в mariadb? Вы не можете сравнивать сжатые на диске текстовые файлы с файлами innoDB, оба решают разные проблемы... Также вы сравниваете разные алгоритмы сжатия ... Также в InnoDB вы добавляете больше столбцов, плюс механизм innoDB добавит информацию о том, как использовать/читать существующие записи, а также добавить заголовки записей. 11.09.2019
  • Основная причина, по которой я делаю этот перенос из файла в mariadb, связана с производительностью. я использовал php-скрипт для доступа к файлу и повторил его пользователю, но я заметил, что была большая задержка (получить zip, разархивировать, найти последний файл json и повторить его). Альтернативным решением для ускорения процесса является переход на mariadb, но объем хранилища значительно увеличился. Приветствуются любые предложения по минимизации размера хранилища. 11.09.2019
  • Почему вы не сжали файл по отдельности? Тогда ваш процесс будет таким: найти, разархивировать, эхо 11.09.2019
  • каждый почтовый индекс содержит версию каждого файла, а также дополнительный файл json с charcteristict каждой версии, т.е. дату создания, хэш, значение индекса - чем больше последнее. имея один почтовый индекс, чтобы получить доступ и поддерживать его проще, чем иметь несколько почтовых индексов. 12.09.2019
  • @PantelisLivadiotis - Разве это не означает разархивировать старую версию, добавить новый файл, а затем повторно заархивировать? 19.09.2019

Ответы:


1

Столбец JSON, о котором идет речь, json_data, правильно? В среднем (без сжатия) около 10 КБ, верно? В реализации файла есть несколько «версий» каждой, верно? Если да, то как узнать, какой из них вы хотите доставить пользователю?

  • Большинство методов сжатия дают соотношение 3:1; Сжатие InnoDB дает вам 2:1. Частично это связано с тем, что в нем есть вещи, которые он не может (или не будет) сжимать.
  • Сжатие только столбца JSON (в клиентском коде) и его сохранение в MEDIUMBLOB, вероятно, займет меньше места в InnoDB, чем использование COMPRESSED. (Но это не будет огромной экономией.)
  • Сосредоточьтесь на том, как вы выбираете, какая «версия» JSON доставляется пользователю. Оптимизируйте схему вокруг этого. Затем решите, как хранить данные.
  • Учитывая, что таблица может эффективно сказать, какой файл содержит нужный JSON, это будет лучшим подходом. И используйте какую-нибудь обычную технику быстрой распаковки; не сосредотачивайтесь на максимальном сжатии.
  • Если char(32) COLLATE utf8_bin является шестнадцатеричной строкой, используйте ascii, а не utf8.
  • Если он шестнадцатеричный, то UNHEX для дальнейшего сокращения до BINARY(16).
  • Когда строка больше 8 КБ, некоторые данные (вероятно, json_data) сохраняются «не для записи». Это подразумевает дополнительный доступ к диску, а выделение дисков немного более неаккуратно. Таким образом, сохранение этого столбца в виде файла занимает примерно столько же времени и места.
  • ОС, вероятно, выделяет пространство кусками по 4 КБ. InnoDB использует блоки размером 16 КБ.
11.09.2019
  • Да, json_data — это столбец, который значительно увеличивает объем памяти. Да в среднем 10КБ. Да несколько версий каждого файла. Последний доставляется. значение хеш-функции используется для сравнения, есть ли изменения в файле, и каждый раз, когда он изменяется, значение index_value увеличивается, поэтому наибольшее значение index_val является последней версией. Я попытался сжать один столбец и тип данных blob, но объем памяти существенно не изменился. Я не ожидал, что алгоритм php zip будет так сильно отличаться от алгоритма сжатия sql. 12.09.2019

  • 2

    Это тип text, который занимает слишком много места. Вы можете попробовать заменить его меньшим вариантом текстового типа если вы можете считать само собой разумеющимся, что такая длина в порядке. Также замена char(32) на varchar(32) поможет, если эти значения не всегда имеют полную длину.

    Или вы можете использовать varchar даже для текстового поля, но следите за тем, что находится на этот ответ, прежде чем сделать это.

    Надеюсь, я помог!

    11.09.2019
  • Я не минусовал, но этот ответ неверен. Все типы переменной длины, VARCHAR, VARBINARY, BLOB, TEXT и все их родственники не занимают больше места в зависимости от типа. Они хранят только длину строкового значения, которое вы в них вставили. 11.09.2019
  • ι не может уменьшиться до меньшего типа данных. я пытался использовать текст, а не длинный текст, и некоторые данные json не могли быть добавлены. самый большой из обнаруженных на данный момент составляет 2 МБ без сжатия 11.09.2019
  • Фактические требования к хранению текстовых полей в первую очередь зависят от данных, которые вы храните в этих полях. Просто потому, что существует огромная разница в потенциальном максимальном размере данных, это не означает, что есть большая разница, если в этих полях хранятся небольшие биты данных. Имя idhash указывает, что поле будет хранить хеш, который будет иметь постоянную длину. 11.09.2019
  • 2 МБ требуется MEDIUMTEXT. 11.09.2019
  • Новые материалы

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..