こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

頻繁に書き換わるデータの記録について

CREATE TABLE `ip` (
`ip` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`ip`),
KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

このようなMySQLのテーブルがあり、サイトに訪問者がアクセスしてきたら

SELECT ip FROM ip WHERE ip = "{訪問者のIP}"

のようにしてIPが記録されているかを確認し、もし記録されていなければ

INSERT INTO ip VALUE ('{訪問者のIP}','{現在のタイムスタンプ}')

のようにしてIPとタイムスタンプを記録し、その上で

DELETE FROM ip WHERE date < '{7日前のタイムスタンプ}'

のようにして古いIPを消す、みたいなプログラムがあります。


このようなプログラムで記録するIPが数万、数十万と増えてきたとき、
負荷削減などを考えるとMySQLを使わずに、
INSERTの代わりにファイル名がIP、内容が空のファイルを生成し、
SELECTの代わりにファイルが存在するかをチェックし、
DELETEの代わりにファイル生成時間が7日前以前のファイルを削除する、
というようなプログラムにしたほうがいいのかと疑問を抱えています。

IPの1文字目、2文字目などから適宜ディレクトリ分けし、
1ディレクトリ内のファイル数が多くならないように調整するようにと考えています。

MySQLを使うのと使わないのとで、
一般的にはどちらのほうが高速に処理できますか?

よろしくお願い致します。

投稿日時 - 2011-12-10 15:28:33

QNo.7182005

困ってます

質問者が選んだベストアンサー

MySQL等のDBMSの方が高速です。

投稿日時 - 2011-12-10 15:58:19

お礼

理由も欲しかったです。

投稿日時 - 2011-12-23 21:04:27

ANo.1

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

たんにログを冗長にとりつづけるならロガーで十分ですが
集計を考えるならファイルでの管理は考えられないですね

頻度が高い場合はHEAPで処理するとか、デバイスをSSDにするとか
いろいろスピードアップはできますが極度に頻度が高くなると
実はMySQL自体がボトルネックになるケースもあります

NoSQLなど別の切り口もありますが、HandlerSocketなどMySQLの拡張で
対応することもできるようです。
この辺のオーバーヘッドが気になるころには実は個人であれこれ
考えるレベルではなくなっている状況なんですけどね

投稿日時 - 2011-12-10 18:29:17

補足

集計における利便性ではなく、どちらのほうが高速かについて質問してます。

とはいえ、勉強になりました。
ご回答ありがとうございました。

投稿日時 - 2011-12-23 20:56:43

ANo.2

『このようなプログラムで記録するIPが数万、数十万と増えてきたとき』
実際に、このような状況になってから心配しましょう。

ま、そういう1日数十万アクセスのあるサイトの運用経験はありますが、そのときはIP重複チェックなどせずにバンバンとデータをインサートしていって、cronで短時間毎(10分毎など)に過去データや不要なデータを削除して、集計して統計データに変換しながら別のDBに登録をして…と、時間の掛かる処理は裏で動かすような工夫を盛り込んでましたけどね。
求められる機能がリアルタイム性を求められるのかどうかによって、どういう工夫を盛り込めばいいのかなどが異なりますが。

ま、サーバの負荷はあまり気にしなくてもいいんじゃないですかね。
アホな高負荷システムを作ったというならともかく、大量アクセスが原因の高負荷なら、その大量アクセスに耐えられるサーバに乗り換えりゃいいわけで。
アクセス数が多い=稼げる(?)サイトなんだから、高機能サーバ、高機能プランに乗り換えは当たり前と。
(あくまで、アホな高負荷システムではないという大前提)

ま、ファイルで分けるとするとファイル日付を変更するためにタイムスタンプ変更。
トランザクションが効かせる事のできないファイルシステムを利用するわけなので、タイミングのエラーが発生するかも知れないのでそのエラー対策。
同時に同一ファイルにアクセスするプロセスが複数あった場合の為にファイルロック。
ファイル数が多くなれば、効率が悪くなるからとIPの1文字目、2文字目などから適宜ディレクトリ分け、その場合にディレクトリの存在非存在チェック。

どうやら、アホな高負荷システム(=他に簡単確実、低負荷な方法があるのに、わざわざ無意味に難しく高負荷な方法を選んだシステム)が出来上がりそうな予感です。

投稿日時 - 2011-12-10 17:16:59

補足

> 実際に、このような状況になってから心配しましょう。

すでにこのような状況になっているから質問してます

投稿日時 - 2011-12-23 20:50:42

お礼

「どちらのほうがサーバーに負荷がかからないか」に対して
「負荷を気にする必要のないくらい良いサーバーを使え」では何の解決にもなりません。

質問に対して回答する気がないのなら投稿しないでください。
読む時間がもったいないです。

投稿日時 - 2011-12-23 21:03:20