2012-05-02 3 views
1

私はそれらを検索し、ユーザー彼に関連する最後のN個のアクションを表示し、すべてのアクションを表示するために、専用のページに移動できるようにする必要があり忙しいのウェブサイトに「アクティビティログ」を追加しているなど大量のロギングデータを格納するための優れたDBスキーマは何ですか?使用

DB MySQLは、私はログを格納する方法が不思議です - 私はFULLTEXTの検索に使用される単一のMyisamテーブルを開始し、すべてのアクションで余分な選択クエリを避けるために:1)そのテーブルへの挿入が起こる2)APCそれぞれのキャッシュが更新されるため、次のページリクエストではmysqlは使用されません。キャッシュにはログの有効期間があり、見つからない場合は最初のAJAXリクエストが作成されます。

ユーザーごとに3つの最後のイベントがキャッシュされているので、新しいイベントが発生すると、現在のキャッシュを取得し、新しいイベントを先頭に追加して最も古いイベントを削除します。 。サイトのすべてのページに小さなボックスが表示されます。

これは適切な設定ですか?この種の機能を実装することをどのようにお勧めしますか?

私が持っているスキーマは次のとおりです。

CREATE DATABASE `audit`; 

CREATE TABLE `event` (
`eventid` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`userid` INT UNSIGNED NOT NULL , 
`createdat` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
`message` VARCHAR(255) NOT NULL , 
`comment` TEXT NOT NULL 
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

ALTER DATABASE `audit` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

ALTER TABLE `audit`.`event` ADD FULLTEXT `search` (
    `message` (255) , 
    `comment` (255) 
); 
+0

あなたは私達にあなたの既存の設計のためのスキーマを表示することができますか? –

+0

@Neville K、done – Fluffy

答えて

2

、私は(脇キャッシング)推測している、あなたは、毎秒多数のレコードを挿入し、select * from event where user_id = ? order by created_date descの線に沿って、かなりまれなクエリを実行していることでしょうおそらくはページング戦略を使用しています(したがって、ユーザーの履歴を表示するためにクエリの最後に「制限x」が必要です)。

特定の種類のイベントの影響を受けるすべてのユーザーを検索したいと思うかもしれませんが(オフラインプロセスではそうかもしれませんが(たとえば、パスワードを更新したすべてのユーザーへの夜間メールなど)、それに沿って。select user_id from event where message like 'password_updated'のライン

は、コメントの本文を検索する多くの場合がある可能性が高い

あなたは間違いなくMySQL Manual on tuning for insertsをお読みください。?あなたはフリーテキストで検索する必要がない場合は "私はインデックスをオフにしたいと思います;私はまた、 "メッセージ"テーブルの通常のインデックスを検討したいと思います。

「message_type」の概念を導入することで、(「password_updat3」というスペルをコードに頼るのではなく)リレーショナル一貫性を導入することもできます。たとえば、イベント表との外部キー関係を持つ「event_type」表があるとします。

キャッシュについては、ユーザーが履歴ページをあまり頻繁には訪れないと推測しています。私があなたの設計を理解していれば、彼らの歴史を訪れるかもしれないオフ・チャンスで、サイトにアクセスしたときにキャッシュにデータを書き込むと、ソリューションのスケーラビリティがあなたのキャッシュに収まる履歴レコードの数に即座に制限されます。履歴表がユーザーのために非常に迅速に成長するため、これはすぐに重要な要素になる可能性があります。

このようなデータは、すばやく移動し、めったに訪問されないため、キャッシュが適切な解決策ではない可能性があります。

+0

私は3人の最後のイベントをキャッシュしています。新しいイベントが発生したときに、現在のキャッシュを取得し、新しいイベントを先頭に追加して最も古いイベントを削除します。キャッシュ内にある。サイトのすべてのページに小さなボックスが表示されます。 – Fluffy

+0

その場合、キャッシュは間違いなくあなたの友人です - あなたはその情報で質問を更新したいかもしれません。原則として、まずデータベースにイベントを書き込んでから、データベースからキャッシュを更新したいと思います。これにより、キャッシュが同期しなくなります(特に、異なるサーバーに負荷がかかる要求を持つロードバランスされたファームがある場合)。これでパフォーマンスの問題が発生するかもしれませんが、最初にテストして、実際に問題がある場合にのみ最適化します。 –

-1

私のアドバイスは、スキーマレスのストレージシステムを使用するだろう...彼らは、大量のログデータでより良い実行

  • を検討してみてくださいRedis
  • MongoDB
  • Riak
  • 012あなたのスキーマに基づいて

またはその他のNo SQLシステム

1

これはPrestaShopのは、それをしない方法です: CREATE TABLE IF NOT EXISTS `ps_log` ( `id_log` int(10) unsigned NOT NULL AUTO_INCREMENT, `severity` tinyint(1) NOT NULL, `error_code` int(11) DEFAULT NULL, `message` text NOT NULL, `object_type` varchar(32) DEFAULT NULL, `object_id` int(10) unsigned DEFAULT NULL, `id_employee` int(10) unsigned DEFAULT NULL, `date_add` datetime NOT NULL, `date_upd` datetime NOT NULL, PRIMARY KEY (`id_log`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

関連する問題