Мы храним зашифрованное содержимое файла в базе данных PostgresSQL.Мы храним их много.На данный момент мы не можем записать это содержимое в любом другом месте (например, FTP или внутреннее хранилище).Тем не менее, наша база данных становится все быстрее и быстрее.
Я уже знаю, что PostgreSQL сжимает строковые данные по умолчанию, поэтому мой вопрос: стоит ли выполнять сжатие строк на стороне приложения, прежде чем вставлять его вбаза данных.Сохранит ли это какое-либо пространство?
Может быть, вы знаете, как настроить PostgreSQL или любые другие методы, чтобы сэкономить место при хранении файлов в таблице PostgreSQL.
Мой расширенный ответ
Поскольку я хотел узнать больше, я провел несколько экспериментов.
- Я создал исходный файл с 20000 строк , где 1 строка = 50000случайные символы .
- Создан файл, в котором 1 строка представляет собой сжатую строку из исходного файла с использованием
gzdeflate
- Я создал таблицу с одним столбцом и вставил каждую строку в виде 1 строки.
- Сравненные размеры
Вот результаты:
- исходный файл - ~ 1 ГБ
- файл с каждой сжатой строкой- 4,45 МБ
- столбец
text
STORAGE EXTENDED
- размер таблицы 13 МБ - столбец
text
STORAGE EXTERNAL
- размер таблицы 1MB + toast 1027MB - столбец
bytea
с предварительно gzdeflated данными - размер таблицы 5.2MB
Я былитийОбращаем ваше внимание на то, что предварительное сжатие и сохранение данных в виде текста с STORAGE EXTENDED
возможно, и в результате получилось 700kb размер таблицы НО предварительно сжатые данные содержат символы из большинства палитр кодировки.Извлечение таких данных было бы невозможным.
Вывод:
- Если вы предпочитаете хранить данные как
text
, ~ 13 МБ на ~ 1 ГБ контента очень приятноratio. - Если вам нужно лучшее сжатие, и вы не против хранить данные как blob / bytea и создавать дополнительные сценарии для управления вставленными / извлеченными данными ... хорошо ... подумайте, стоит ли это несколько МБ.
- Также помните: по умолчанию PostgreSQL сжимает строки
>2kb
.Если ваша строка содержит менее ~ 2000 символов, вы должны изменить этот параметр или сжать данные самостоятельно.