2012-03-07 8 views
3

ユーザのログインをすべて追跡する必要があるので、ログインするたびにタイムスタンプがあるようにします。これを行う最も効率的で最良の方法は何ですか?MySQL + PHP - ユーザがログインするたびにタイムスタンプを保存する最も良い方法

私はいつもunixのタイムスタンプを文字で区切って格納しているusersフィールドのテキストフィールドを持っています。彼らがログインするたびに、別のタイムスタンプが最後に追加されます。

1243453458|1255476933|1263453743|1318495068| 

これは悪い方法ですか?私は、ユーザーがログインするたびに行がある個別のログインテーブルを考えていますが、この情報を取得するときにはDBの負荷が非常に高くなります。

私はこれらのタイムスタンプをPHPで処理し、データからjQueryを使用してグラフを作成しています。あなたのパイプで区切られたアプローチは良いではありません:あなたはTIMESTAMP

を使用することができますMySQLで

答えて

5

はい、そのです。これはタイムスタンプを含む何かを保存する恐ろしい方法です。これを行うにはもっと良い方法があります。でも、最も簡単な表には、あなたに多くの優れたパフォーマンスを提供します:

user_id (int) | last_login (timestamp) 
  • あなたは文字列としてタイムスタンプを保存しています。ストレージ、検索、および更新には完全に非効率的です。あなたは最終的に列の制限に遭遇します。
  • この種の目的では、の高度に最適化されたデータ型があります.SQLサーバの開発者は、効率的にデータを格納することを知っている傾向があります。
  • 固定サイズの行を持つ小さなテーブルのデータベースヒットは、アプリケーションでさらに処理する必要のある可変サイズの文字列を持つテーブルとは異なり、無視されます。

つまり、アプリケーションを最適化しようとすると(間違った前提に基づいて - 「別のテーブルが非常に緊張している」)、あなたは全体的に非効率的な解決策を思いついてしまいます。物事を過度に複雑にしないでください。不確かな場合は、両方のオプションをプロファイルし、自分自身で確認してください。

+0

偉大な答え、ありがとう。私はストレージ効率についてこの誤解を抱いていたと思います。 – BadHorsie

0

EDIT設定する方法の表情hereを持っています。あらゆる種類のユーザーイベントを格納するトランザクションテーブルを持つことができます。

4

あなたは、おそらくのようなもの、データベース内の別のテーブルにそれを置く方が良いだろう:上の操作を行うために容易になるだろうと思います意味

members_logins 
member_id (int) | timestamp (timestamp) 

+0

これは間違いなく最良の方法です – scibuff

+0

私はこれを行う最良の方法であることを知っていますが、それは潜在的に何百万もの行を格納する価値があるかどうかはわかりません。ユーザーに最後の50回のログインのみを保存するようにテーブルを制限したい場合、これを行う最も簡単な方法は何ですか? – BadHorsie

+0

'DELETE FROM members_login WHERE timestamp <(timestamp FROM members_logins ORDER BY timestamp LIMIT 50,1)' – fire

関連する問題