1

忙しいウェブサイトに「アクティビティログ」を追加しています。これにより、ユーザーに関連する最後のN個のアクションが表示され、専用ページに移動してすべてのアクションを表示したり、検索したりできるようになります。

使用されるDBはMySQLであり、ログをどのように保存する必要があるのか​​疑問に思っています-全文検索に使用される単一のMyisamテーブルから始め、すべてのアクションで余分な選択クエリを回避するために:1)そのテーブルへの挿入が発生します2 )それぞれのAPCキャッシュが更新されるため、次のページのリクエストではmysqlは使用されません。キャッシュにはログの有効期間があり、キャッシュが欠落している場合は、ユーザーからの最初のAJAXリクエストによってキャッシュが作成されます。

ユーザーごとに最後の3つのイベントをキャッシュしているので、新しいイベントが発生したときに、現在のキャッシュを取得し、新しいイベントを先頭に追加して最も古いイベントを削除します。これにより、キャッシュには常に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 )
);
4

3 に答える 3

2

スキーマに基づいて、(脇に置いて)1秒あたりに多くのレコードを挿入しselect * from event where user_id = ? order by created_date desc、おそらくページング戦略を使用して、の行に沿ってかなりまれなクエリを実行することになると思います(したがって、最後に「limitx」が必要です)ユーザーに履歴を表示するためのクエリの。

また、特定の種類のイベントの影響を受けるすべてのユーザーを検索することもできますが、オフラインプロセス(たとえば、パスワードを更新したすべてのユーザーへの毎晩のメール)で発生する可能性が高くなります。これには、の行に沿ったクエリが必要になる場合がありますselect user_id from event where message like 'password_updated'

コメントの本文を検索したい場合が多いですか?

インサートのチューニングに関するMySQLマニュアルを必ずお読みください。フリーテキストの「コメント」で検索する必要がない場合は、インデックスをオフのままにしておきます。「メッセージ」テーブルの通常のインデックスも検討します。

また、「message_type」の概念を導入して、(コードに依存して「password_updat3」のスペルを正しくするのではなく)関係の一貫性を導入できるようにすることも理にかなっています。たとえば、イベントテーブルへの外部キー関係を持つ「event_type」テーブルがあるとします。

キャッシングに関しては、ユーザーが履歴ページにアクセスすることはめったにないと思います。サイトにアクセスしたときにキャッシュにデータを入力すると、オフチャンスで履歴にアクセスする可能性があります(設計を理解している場合)。ソリューションのスケーラビリティは、キャッシュに収まる履歴レコードの数にすぐに制限されます。履歴テーブルはユーザーにとって非常に急速に大きくなるため、これはすぐに重要な要素になる可能性があります。

すばやく移動し、ほとんどアクセスされないこのようなデータの場合、キャッシュは適切なソリューションではない可能性があります。

于 2012-05-02T09:25:31.723 に答える
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 ;

于 2015-07-31T08:33:23.597 に答える
-1

私のアドバイスは、スキーマの少ないストレージシステムを使用することです..大量のログデータでパフォーマンスが向上します

検討してみてください

  • Redis
  • MongoDB
  • Riak

または他のNo SQLシステム

于 2012-05-02T08:56:16.393 に答える