2017-06-21 5 views
1

ありがとうございました! (私はサーバが時間をかけて成長する方法を私たちのファイルを理解しようとしています、と私は使用データを収集し、その上で統計を実行することによって、これをしたいと思っパフォーマンスを向上させるには、フラットCSV入力ファイルからDBを正規化しますか?

背景

:私は私の質問を打破しようとしています最大のディレクトリ、最も急速に成長しているディレクトリなど)。
SCANID、スカンジウム、DIR、FILENAME、SIZE、MODTIME、ATIME、OWNER

:私は、ディレクトリツリーを歩き、CSVへのデータは、以下のヘッダを持つファイルに書き込むスクリプトを書かれている1つのスナップショットを収集するために

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を小さくするか速くしません。これとは別に、私のアプローチが妥当であるかどうかは分かりません。

ありがとうございました。

答えて

1

私はいくつかの考えを特別な順序で書きません。

このデータに対して実行する特定のSQLクエリは記述されていないため、インデックスやその他の最適化に関する戦略を立てることはできません。これらは重要であり、しばしばデータのサイズより重要です。

とにかくすべての行をスキャンする必要がある複雑なレポートクエリを実行する場合は、パフォーマンスを向上させるために列指向のストレージエンジンを使用する必要があります。ここでも、これは最適化する必要のあるクエリの種類によって異なります。

SCAN_DATE(3 bytes)と1:1の関係があるため、SCAN_ID(4バイト)を使用する理由がわかりません(btw、意味がある場合は「relation」という用語を使用しないでください)。 "関係")。 SCAN_IDを使用しない場合は、SCAN_DATE、FILE_IDをSIZES表の主キーとして使用できます。

ファイルのプライマリキーとして、ファイルのinode numberを使用できます。 inode番号はファイルシステムごとに独立して番号が付けられていますが、サーバが複数のファイルシステムをマウントする場合は、プライマリキーにファイルシステムの識別子も含める必要があります。

+0

ご意見ありがとうございました。私は詳細を追加するために質問を編集しました。私が実行したいクエリは、ユーザーごとまたはディレクトリごとに成長率(つまり、時間の経過とともに合計ファイルサイズが増加する)です。 私は本当にinode番号を使うのが好きです。私はそれを試してみる。 – divingTobi

+0

私は(inode、devid)をプライマリキーとして使用することにしました。コメントいただきありがとうございます。 – divingTobi

関連する問題