1 つの InnoDB MySQL テーブルを使用して、PHP サイトの「アクティビティ ログ」を作成したいと考えています。ウェブサイトにアクセスした人は誰でもテーブルに新しいレコードを挿入し、それが記録されます...
- 彼らのIPアドレス
- サインインしているアカウントの ID (サインインしていない場合は null)
- 彼らがサーバーに行ったリクエスト
- リクエストを受信した日時
- ユーザーエージェントが送信されましたが、PHP スクリプトがボットであると判断した場合のみ(それ以外の場合は null)
同時に、テーブルを使用して...
- 各ページが年/月/日/などに受け取るヒット数を決定する
- 年/月/日/などのユニークビジター数を決定する
- 実用的であれば、PHP スクリプトを使用してオンザフライで以前の情報を取得し、必要に応じてボット リクエストを除外します。
私が念頭に置いている次の表について、いくつかの質問 (およびいくつかの推論) があります。
CREATE TABLE `activity` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ip` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`account` int(11) unsigned DEFAULT NULL,
`request` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`time` time NOT NULL,
`year` year(4) NOT NULL,
`month` tinyint(2) unsigned NOT NULL,
`day` tinyint(2) unsigned NOT NULL,
`bot` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
)
このスタイルのロギングは実用的ですか? 実用的な意味の挿入と選択はミリ秒単位で実行できます。この方法で多くのレコードを生成できることはわかっていますが、やりたいことすべてを達成するためのより良い方法があるかどうかは完全にはわかりません.
さらに、「今日」のヒット数を選択して、提供される各ページの下部に配置することは実用的でしょうか? 私は比較的大規模なデータベースでの作業に慣れていませんが、どのクエリが高速で、どのクエリが苦痛になるかをまだ学んでいます。
主キーを保持する必要がありますか? 気まぐれに戻って必要な行を編集するためにそれを使用できますが (重要な理由で自分が実際にそうしているとは思えません)、INSERT が大幅に遅くなりますか? 何か利点はありますか?同じ理由で、これ以上インデックスを追加するべきではありません。外部キー (アカウント列用) を含めますか?
現在の日付と時刻を取得する代替手段は実用的ですか? 私は最初、このテーブルを 1 つの DATETIME 列で開始しましたが、このようなテーブルでは日付情報を分割する列が役立つ可能性があることをどこかで読みました。たとえば、「今日」のヒット数を数えたい場合、結果を次のように制限できます...
WHERE year="2012" AND month="02" AND day="16"
...とは対照的に...
WHERE date > "2012-02-15 23:59:59"
前もって感謝します!