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 マウスホバー遷移ズーム効果

推薦する

MySQL を使用して Excel でデータ生成を完了する方法

Excel は、データ分析に最もよく使用されるツールです。この記事では、MySQL と Excel ...

Vueはel-tableを使用して列と行を動的に結合します

この記事の例では、el-tableを使用して列と行を動的にマージするVueの具体的なコードを参考まで...

MySQLインデックスの使用に関するヒントと注意事項

1. インデックスの役割一般的なアプリケーション システムでは、読み取りと書き込みの比率は約 10:...

Vueコンポーネントドキュメントを自動生成する方法を分析する

目次1. 現状2. コミュニティソリューション2.1 事業レビュー3. 技術的ソリューション3.1....

Robots.txtの詳細な紹介

robots.txt の基本的な紹介Robots.txt はプレーンテキスト ファイルであり、Web...

MySQL ステートメントの配置と概要の紹介

SQL (Structured Query Language) ステートメント、つまり構造化クエリ言...

ファイル操作のためのLinuxシステムコール

目次1. ファイルを開くパラメータの紹介2. ファイルの読み取り3. ファイルを書き込む4. 閉じる...

フロントエンドJavaScriptの約束

目次1. Promiseとは何か2. 基本的な使い方3. Promiseメソッド3.1 Promis...

ウェブページのカラーマッチングにおけるオーバーラップとソフトカラーマッチングの手法を詳しく説明

この記事には、細かい点は一切なく、カラーマッチングのテクニックをシェアするだけです。とてもシンプルで...

Linux QT Kit が見つからない、バージョンが空の問題の解決策

現在このような問題が発生しています 私の状況は、QT が動かなくなってしまったため、仮想マシンを再起...

MySQLデータベース入門:データベースバックアップ操作の詳細な説明

目次1. 単一データベースのバックアップ2. 圧縮バックアップ3. マルチデータベースバックアップ4...

CSS3を使用してテキストの垂直配置を実現する方法

最近のプロジェクトでは、テキストを垂直に揃えたいと考え、CSS の writing-mode プロパ...

2 つの Linux サーバー間の自動ファイル同期

サーバーB(172.17.166.11)の電源がオンまたは再起動されると、サーバーA(172.17....

CSS3はNESゲームコンソールのサンプルコードを実装します

成果を達成する実装コードhtml <input type="radio" ...

Linux で lvm 論理ボリューム パーティションのサイズを調整するチュートリアル (xfs や ext4 などのさまざまなファイル システム用)

序文システムをインストールしたときに、パーティション領域を適切に割り当てませんでした。その後のメンテ...