ありがとうございました! (私はサーバが時間をかけて成長する方法を私たちのファイルを理解しようとしています、と私は使用データを収集し、その上で統計を実行することによって、これをしたいと思っパフォーマンスを向上させるには、フラットCSV入力ファイルからDBを正規化しますか?
背景
:私は私の質問を打破しようとしています最大のディレクトリ、最も急速に成長しているディレクトリなど)。
SCANID、スカンジウム、DIR、FILENAME、SIZE、MODTIME、ATIME、OWNER
SCANID:スキャン
スカンデートをidentifiyingランダムuuid4文字列:スキャンが開始された日付(必ずしも1:SCANIDとの1関係)
課題
これをMySQLの同等のテーブルにインポートすることはできますが、すぐにパフォーマンスの問題にぶつかります。私たちのシステムには何百万ものファイルがあります。私はスペースの大きな塊があなたは私がすべてのスキャンのためにそれらを繰り返し続ける場合は特に、ディレクトリおよびファイル名に取り込まれると考えてい
CREATE TABLE IF NOT EXISTS FILES (
SCANID VARCHAR(40),
SCANDATE DATE,
DIRECTORY VARCHAR(700),
FILENAME VARCHAR(300),
SIZE BIGINT,
ATIME DATETIME,
MODTIME DATETIME,
OWNER VARCHAR(50)
);
:MySQLのテーブルには、次のようです。
私はデータをどうしたいの分析は、次のとおりです。
*がどれだけ速く、総必要なディスク容量は、時間の経過とともに成長しないユーザーは、ほとんどのスペース使用しています*どの
- SELECT OWNER, SUM(SIZE) FROM FILES GROUP BY OWNER ORDER BY SUM(SIZE) DESC;
が
*ディレクトリ最速の成長を時間をかけて時間をかけて、ほとんどのデータを生成し、ユーザー
*は
は3つのテーブル、とだけCOLを作成します。 FILES
CREATE TABLE IF NOT EXISTS FILES (
SCAN_ID INT,
DIR VARCHAR(700) DEFAULT NULL,
FILENAME VARCHAR(500) DEFAULT NULL,
ATIME DATETIME DEFAULT NULL,
MODTIME DATETIME DEFAULT NULL,
OWNER VARCHAR(50) DEFAULT NULL,
PRIMARY KEY (DIR, FNAME)
);
表2:(私は唯一のサイズが変更かどうかを知りたい、とだけ最新の所有者、ADATEとmdateを保つ)
表1に変化するデータをLECT
SCAN_ID、FILE_IDのサイズ、SIZE
表3:
SCAN_ID、スカンデートをSCANDATES
、私は同じで、一時テーブル(FILES_IMPORT)への完全なCSVファイルをロードしていますが取得するには構造をCSVファイルとして保存し、日付をそれぞれのテーブルに配布します。
がINSERT INTO FILES (DIR, FNAME, OWNER, ATIME, MODTIME)
SELECT DIR, FNAME, OWNER, ATIME, MODTIME FROM FILES_IMPORT
ON DUPLICATE KEY UPDATE
OWNER=VALUES(OWNER),
ATIME=VALUES(ATIME),
MODTIME=VALUES(MODTIME);
として(DIR、FILENAME)主キーがあり、これが唯一のファイルごとに1つのエントリを持つことの要件を満たす:
表1は、したがって、私が今まで見てきたすべてのファイル名を持つ必要があります。
質問
しかし、私はSIZESテーブルを更新する方法を知りません。私はそこに主キーとして(DIR、FNAME)を持っていないと思うので、それはDBを小さくするか速くしません。これとは別に、私のアプローチが妥当であるかどうかは分かりません。
ありがとうございました。
ご意見ありがとうございました。私は詳細を追加するために質問を編集しました。私が実行したいクエリは、ユーザーごとまたはディレクトリごとに成長率(つまり、時間の経過とともに合計ファイルサイズが増加する)です。 私は本当にinode番号を使うのが好きです。私はそれを試してみる。 – divingTobi
私は(inode、devid)をプライマリキーとして使用することにしました。コメントいただきありがとうございます。 – divingTobi