MySQL に IP アドレスを効果的に保存する方法と、文字列 IP と数値を変換する方法の詳細な説明

MySQL に IP アドレスを効果的に保存する方法と、文字列 IP と数値を変換する方法の詳細な説明

High Performance MySQL バージョン 3 (セクション 4.1.7) を見ると、著者は IPv4 アドレスを保存するときに、文字列ではなく 32 ビットの符号なし整数 (UNSIGNED INT) を使用して IP アドレスを保存することを推奨しています。しかし、具体的な理由は示されなかった。その理由を知るために、いくつかの情報を調べて記録しました。

文字列ストレージと比較して、符号なし整数をストレージに使用すると、次の利点があります。

  • データ保存スペースとインデックス保存スペースの両方を節約
  • 範囲クエリ(BETWEEN...AND)を使用すると便利で効率的です

通常、IPv4 アドレスを保存する場合、IPv4 アドレスには最低 7 文字、最大 15 文字が必要なので、VARCHAR(15) を使用できます。 MySQL が可変長文字列を保存する場合、文字列の長さを保存するために追加のバイトが必要になります。符号なし整数を使用して保存する場合は、4 バイトのみが必要です。さらに、4 つのフィールドを使用して IPv4 の各部分を個別に保存することもできますが、通常、ストレージ スペースとクエリ効率の点では、これはそれほど高くありません (この保存方法が適しているシナリオがいくつかある場合があります)。

文字列と符号なし整数を使用して IP を保存する場合の詳細なパフォーマンス分析とベンチマークについては、この記事を参照してください。

符号なし整数を保存に使用すると、次のような欠点もあります。

  • 読みにくい
  • 手動変換が必要

変換のために、MySQL は、文字列形式の IP を整数 INET_ATON に変換し、整数形式の IP を文字列 INET_NTOA に変換するための対応する関数を提供します。以下のように表示されます。

 mysql> inet_aton('192.168.0.1') を選択します。
+--------------------------+
| inet_aton('192.168.0.1') |
+--------------------------+
| 3232235521 |
+--------------------------+
セット内の 1 行 (0.00 秒)
 
mysql> inet_ntoa(3232235521) を選択します。
+-----------------------+
| inet_ntoa(3232235521) |
+-----------------------+
| 192.168.0.1 |
+-----------------------+
セット内の 1 行 (0.00 秒)

IPv6 の場合、VARBINARY を使用することで同じ利点が得られ、MySQL では対応する変換関数、つまり INET6_ATON と INET6_NTOA も提供されます。
文字列 IPv4 と数値型を変換するには、アプリケーション層に配置することができます。以下は、この 2 つを変換する Java コードです。

パッケージ com.mikan;
 
/**
 * @author みかん
 * @日付 2015-09-22 10:59
 */
パブリッククラスIpLongUtils {
    /**
     * 文字列IPをlongに変換する
     *
     * @param ipStr 文字列 IP
     * @IPに対応するlong値を返します*/
    パブリック静的long ip2Long(String ipStr) {
        文字列[] ip = ipStr.split("\\.");
        (Long.valueOf(ip[0]) << 24) + (Long.valueOf(ip[1]) << 16) を返します。
                + (Long.valueOf(ip[2]) << 8) + Long.valueOf(ip[3]);
    }
 
    /**
     * IP の長い値を文字列に変換します*
     * @param ipLong IP の long 値* @return long 値に対応する文字列*/
    パブリック静的文字列 long2Ip(long ipLong) {
        StringBuilder ip = 新しい StringBuilder();
        ip.append(ipLong >>> 24).append(".");
        ip.append((ipLong >>> 16) & 0xFF).append(".");
        ip.append((ipLong >>> 8) & 0xFF).append(".");
        ip.append(ipLong & 0xFF);
        ip.toString() を返します。
    }
 
    パブリック静的voidメイン(String[] args) {
        System.out.println(ip2Long("192.168.0.1"));
        システム出力のprintln(long2Ip(3232235521L));
        System.out.println(ip2Long("10.0.0.1"));
    }
    
}

出力は次のようになります。
3232235521
192.168.0.1
167772161

これで、MySQL に IP アドレスを効果的に保存する方法と、文字列 IP と数値を変換する方法についての記事は終了です。MySQL に IP アドレスを効果的に保存する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL に IP アドレスを保存する方法
  • MySQL の inet_aton() および inet_ntoa() 関数を使用して IP アドレスを保存する方法

<<:  Linux システムでの gcc コマンドの使用法の詳細な説明

>>:  CSS3 マウスホバー遷移ズーム効果

推薦する

jQuery ステップ進行軸プラグインの実装コード

毎日のjQueryプラグイン - ステップ進捗軸 ステップ進捗軸ツール系のサイトでは入門チュートリア...

CSS が初期読み込み時の白い画面の時間に与える影響

外部 CSS ファイルを使用したレンダリング パイプライン上図では、HTML データの要求から DO...

MySQL のグループ分けの例

mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...

Linux で Ceph 分散ソフトウェアをインストールして使用する方法に関するチュートリアル

目次序文1. 基本環境1. サービス配信2. ネットワーク構成(全ノード) 3. SSHパスワードフ...

Vue.js パフォーマンス最適化 N 個のヒント (収集する価値あり)

目次機能コンポーネント子コンポーネントの分割ローカル変数v-show によるDOMの再利用キープアラ...

Linux での MySQL のアンインストールとインストールのグラフィック チュートリアル

ブログを書くのは初めてです。開発に携わって2年になります。仕事の後に何か有意義なことを見つけたいと思...

HTMLデータ送信投稿_PowerNode Java Academy

HTTP/1.1 プロトコルで指定されている HTTP リクエスト メソッドには、OPTIONS、...

JSはオンラインでのアナウンスのスクロール効果を実現します

この記事では、オンラインアナウンスのスクロール効果を実現するためのJSの具体的なコードを参考までに共...

クエリプロファイラを使用して MySQL ステートメントの実行時間を表示する方法

前回の記事では、MySQL ステートメントの実行時間をチェックする 2 つの方法を紹介しました。今日...

CentOS7.3 での MySQL 8.0.13 のインストールと設定のチュートリアル

1. 基本環境1. オペレーティングシステム: CentOS 7.3 2. MySQL: 8.0.1...

webpack と rollup を使用してコンポーネント ライブラリをパッケージ化する方法

序文以前、ローディングスタイルのコンポーネントを作成しました。コードの再利用性を実現するために、この...

MySQL のデバッグと最適化に関する 101 のヒントを共有する

MySQL は強力なオープンソース データベースです。データベース駆動型アプリケーションの数が増える...

MySQL における ESCAPE キーワードの使用法の詳細な説明

MySQL エスケープエスケープとは、エスケープ文字の本来の意味を意味します。エスケープ文字の目的は...

SQLインジェクションの詳しい解説 - セキュリティ編(第2部)

この記事に誤りがあったり、ご提案がありましたら、お気軽にご連絡ください。よろしくお願いいたします。は...

UrlRewriter のキャッシュ問題と関連する一連の調査

ウェブサイト機能を開発する場合、セッション キャッシュを時間内にクリアできません。一連の探索が始まり...