PHP:MySQLにIPを保存する適切な方法と数百万の行全体でIPを検索する最も迅速な方法
-
09-10-2019 - |
質問
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を使用することにより、非常に高速なクエリを実現できます。