質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

3回答

2583閲覧

MySQL 大容量のデータファイルのレコードを保存するのに使うべき?

dongw

総合スコア119

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2019/05/20 16:57

現状

現在作成している、ある機能のログをユーザにダウンロードさせるシステムを作っています。
ログファイルは1日で2GBくらいの容量になります。
ユーザがログをダウンロード出来るのは過去1年分を予定しています。
日付指定で1日単位でダウンロード出来る想定です。

問題

データベースにログ保管用のテーブルを作成して1日単位でレコードを挿入する想定です。
しかし、単純計算で365日分保管すると最大730GBのデータを保管するテーブルになります。
果たして、こういう大容量のファイルを保存する用途でこのようにDBを使うのは一般的なのでしょうか?
他に方法があればどういうものがあるのか教えていただきたいです。

補足

AWS S3のようなファイルストレージサービスにログを保管し、DBのレコードにはそのリンクを挿入する、という設計も考えましたがセキュリティ的に断念しました。
(リンク形式だと、アプリケーション側で設定してある認証や権限周りの範囲から外れてしまう・・・?)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

どこまで厳密に管理するか次第ですが、

楽をするのであればS3で有効期限付きのURLを使えば
AWS ドキュメント » Amazon Simple Storage Service (S3) » 開発者ガイド » Amazon S3 オブジェクトの使用 » オブジェクトのライフサイクル管理 » ライフサイクルの設定のための追加の考慮事項 » オブジェクトの有効期限の設定

ごく簡単に実装出来ると思います。
超長いURLが生成されるので、セキュリティ的に許容できる時間の短さで期限を指定すればOkです。
(これを許容しないのであれば、cookieによるセッションIDだって許容できなくなる)


果たして、こういう大容量のファイルを保存する用途でこのようにDBを使うのは一般的なのでしょうか?

検索や更新といったRDBMSならではの機能を使う必要が無いのであれば、

  1. ドキュメントルート外にデータディレクトリを用意する
  2. ファイル名をyyyymmddかyyyy/mm/ddとディレクトリを分けてその中にファイルを保存する
  3. ダウンロードさせる時は、アプリケーションのファイル読み込み機能を使って出力するか、一定時間で削除されるファイルを作ってドキュメントルートに設置+ダウンロードリンクを表示する(必要であればパスワード付暗号化ファイルにする、リダイレクトページを挟み一回ダウンロードページへリダイレクトしたら使えなくする等)

あたりがよくある(アーキテクチャを問わず実装が出来る&コストもDBを使うよりは低い)実装になるんじゃないかな思います。

投稿2019/05/20 17:59

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dongw

2019/05/25 08:44

ありがとうございます。 別のアプローチを教えていただいてとても参考になります。 自分では思いつかなかった領域でしたので・・・ ログファイル自体は塊として置いておければ問題ない(検索・更新などは考えていない)です。 ただ、DBに大容量を保存することでどれだけサーバ上に負荷がかかるか(DB的には大容量ファイルを置いても問題はないでしょうが・・・)が不明だったので質問させてもらいました。 > 1. ドキュメントルート外にデータディレクトリを用意する 今回は上記の方法を調査してみたいと思います。ありがとうございます!
guest

0

パーティショニングすればできないことはないかなぁという処理だと思いますが

  • ログファイルの個々の明細データに対してなんらかのキーを利用して検索するのか
  • 単に日毎のログファイルをデータの塊としてもっていればいいのか

によって多少運用がことなるでしょう
前者ならDBとしてのメリットが享受できますが、データが膨大になると
RDBよりはビッグデータに長けたnosql的なアプローチが必要かもしれません

後者なら日付単位のログファイルを圧縮してファイルとして保持したほうが
効率的な気がします

投稿2019/05/21 01:37

yambejp

総合スコア114968

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dongw

2019/05/25 08:44

ありがとうございます。 ログの内部に関して検索などは現状考えてません。 > 単に日毎のログファイルをデータの塊としてもっていればいいのか こちらをベースに考えています。 今回のケースだとDB(テーブル)の容量が膨大になっても、ファイルとして保持することがいい(間違ってはない)ということですよね。 参考になります、ありがとうございます。
guest

0

一般的です。mysqlにはご丁寧にarchiveエンジンというものまで用意されているぐらいです。

投稿2019/05/20 17:04

hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dongw

2019/05/25 08:44

ありがとうございます。 archiveエンジンなるものがあるのですね、勉強になります。 DBクライアントツールを利用してDBを操作してるのですが、試しに10GBのレコードを入れてみるとまともに動かなくなり不安になってました。 DB上に制約がなにかあるのかと思いましたが、一般的とのことで安心しました。
hentaiman

2019/05/25 08:56

それはクライアントツールが悪いんじゃないですか?作りにもよるでしょうけどGUIなら重い作りが多そうだし、WEBプログラムだったとしてもDBとプログラムそれぞれに適切なチューニングを施さなければ負荷かかりすぎて障害発生と言っていいほど重くなりますよ。
dongw

2019/05/28 15:01

確かにそうですね。納得しました。 適切なチューニングさえすれば耐えられるということも理解しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問