inet_aton を使用して、IPv4 アドレスを「int unsigned」列タイプに格納しています。[私はこれを正しく行っていますか?また、「符号なし」を使用する必要がありますか?] この特定の列にもインデックスが付けられています。テーブル全体に同じ IP を含む何百万もの行と複数の行があるため、これらの行を検索する最速の方法は何ですか?
..または、これについて間違った方法で行っていますか?
inet_aton を使用して、IPv4 アドレスを「int unsigned」列タイプに格納しています。[私はこれを正しく行っていますか?また、「符号なし」を使用する必要がありますか?] この特定の列にもインデックスが付けられています。テーブル全体に同じ IP を含む何百万もの行と複数の行があるため、これらの行を検索する最速の方法は何ですか?
..または、これについて間違った方法で行っていますか?
これを行うには inet_aton を使用するのが正しい方法であるため、余分な無意味な情報を保存することはありません (任意の 3 つの数値に対して 256 を超える値を保存しても意味がありません)。unsigned int に収まる 32 ビットの数値になります。
int 列にインデックスを付けると、IP アドレスによる検索が高速になります。データベースが非常に大きくなると、この種のものを MySQL に格納するスケーリングの問題が発生し始めます。
あなたはそうしないだろうと思いますが、RDBMS に大規模でビジーなサイトの完全なログ情報を格納することは、一般に悪いこと (tm) であると認められていることを指摘しておきます。データベースが保証するリレーショナル整合性プロパティは必要なく、読み取るよりも多くのエントリを書き込みます。nosql を検討するか、代わりにフラット ファイルに追加し、必要に応じて専用プログラムを使用してログを解析します。
はい、これが MySQL に IP アドレスを保存する最良の方法です。
INET_ATONのドキュメントを見ると、UNSIGNED INT 列を使用することが推奨されていることがわかります。そうしないと、127 を超える最初の oct を持つ IP アドレスは正しく保存されません。
これは、検索を行うための非常に高速な方法でもあります。MySQL は整数列を非常にうまく処理し、この列にインデックスを付け、検索で INET_ATON を使用することにより、非常に高速なクエリを実現できます。
私はこれを正しく行っていますか?そして、「署名なし」を使用する必要がありますか?
はい。より高いIPアドレスがないunsigned
と適切に保存されず、int
(の代わりにvarchar
)を使用すると最も効率的に保存されます。
これらの行を検索する最速の方法は何ですか?
検索の最適化に関しては、検索対象 (追加のテーブルなど) によって異なります。一般に、unsigned int 列にインデックスを付けると、高速なパフォーマンスが得られます。