PHP:MySQLにIPを保存する適切な方法と数百万の行全体でIPを検索する最も迅速な方法

StackOverflow https://stackoverflow.com/questions/3980489

質問

IPv4アドレスをINET_ATONを使用して「int unsigned」列タイプに保存しています。 [私はこれを正しくやっていますか? 「符号なし」を使用する必要がありますか?]この特定の列にもインデックスが付けられています。テーブル全体に同じIPを含む数百万の行と複数の行があるので、これらの行を検索する最速の方法は何ですか?

..それとも私はこれについて間違った方法で進んでいますか?

役に立ちましたか?

解決

私はこれを正しくやっていますか?そして、「符号なし」を使用する必要がありますか?

はい。それなし unsigned より高いIPアドレスは適切に保存されず、 int (それ以外の varchar)最も効率的に保存します。

これらの行を検索する最速の方法は何ですか?

検索最適化に関しては、検索するもの(追加のテーブルなど)に依存します。一般に、署名されていないINTコラムのインデックス作成により、パフォーマンスが高速になります。

他のヒント

INET_ATONを使用することはこれを行う正しい方法であるため、余分な意味のない情報を保存することはできません(特定の3つの数値に対して256を超える値を保存できるという点はありません)。その結果、32ビット数が生じ、署名されていないINTに収まります。

INT列のインデックス作成により、IPアドレスによるルックアップが迅速になります。データベースが非常に大きくなった場合、MySQLにこの種のものを保存するスケーリングの問題に走り始めます。

私はあなたがそれをするつもりはないと仮定しますが、RDBMSに大きな忙しいサイトの完全なログ情報を保存することは、一般的に悪いこと(TM)であることが合意されていることを指摘します。データベースが保証するリレーショナル整合性のプロパティは必要ありません。また、読んだよりも多くのエントリを書きます。 NOSQLを検討するか、代わりにフラットファイルに追加し、必要に応じて専用プログラムを使用してログを解析します。

はい、これはMySQLにIPアドレスを保存する最良の方法です。

ドキュメントを見ると inet_aton 署名されていないINT列を使用することをお勧めします。127を超える最初の10月のIPアドレスは正しく保存されないことがわかります。

これは、検索を行うための非常に速い方法でもあります。 MySQLは整数列を非常によく処理し、この列にインデックスを付けて検索でINET_ATONを使用することにより、非常に高速なクエリを実現できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top