web-dev-qa-db-ja.com

画像をbase64エンコードされた文字列として保存すると、なぜそれが悪いのですか?

私が遭遇した本番データベースの1つでこれを見たことがあります。これらの画像は明らかにDBの大部分をカバーしています。たくさん調べた結果、パフォーマンスの点でなぜそれが実際に悪いのかについて、多くの良い答えを見つけることができませんでした。

はい、ストリームフレンドリーではなく、使用するスペースが最大33%増加します: https://stackoverflow.com/questions/9722603/storing-image-in-database-directly-or-as-base64-data

確かに、それはDBに間違ったヒントを与えます: https://stackoverflow.com/questions/9722603/storing-image-in-database-directly-or-as-base64-data

そして、他の答え: mongodbにファイルを保存する これが問題である理由を実際には説明しないでください

しかし、実際に何が起こっているのですか?base64エンコードされた文字列として画像を保存するデータベースがパフォーマンスを失う可能性がありますか?このような慣行により、DBがselect(またはその他の側面)でパフォーマンスを失うのはなぜですか?

この点でNoSQL(MongoDB)とRDBMS(PostgreSQL)のパフォーマンスを指定する回答も必要です。 MongoDBのようなメモリにあるものの性質は、パフォーマンスへの影響をさらに悪化させますか?もしそうなら、なぜですか?この画像は、両方のシステムで動作するbase64文字列としてどのように保存されますか?

1
Chessbrain

私が見ることができる1つの理由は、あなたがそのように不必要な仕事をしているということです。 PostgreSQLはbase64文字列を圧縮してトーストするので、列をEXTERNALに設定しない限り、圧縮と解凍の代金を支払う必要があります。そうしないと圧縮されませんが、ストレージスペースとI/Oが無駄になります。帯域幅。

ヒント:圧縮バイナリデータをPostgreSQLに保存する場合は、bytea列をEXTERNALストレージに設定します。そうしないと、データを圧縮しようとする無駄な試みでCPUを浪費してしまいます。

2
Laurenz Albe