sql >> データベース >  >> RDS >> Mysql

MySQLの単一の列に128ビットの数値を格納する方法は?

    私は自分自身がこの質問をしていることに気づき、私が読んだすべての投稿から、パフォーマンスの比較は見つかりませんでした。これが私の試みです。

    次のテーブルを作成し、100個のランダムネットワークからの2,000,000個のランダムIPアドレスを入力しました。

    CREATE TABLE ipv6_address_binary (
        id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
        addr BINARY(16) NOT NULL UNIQUE
    );
    
    CREATE TABLE ipv6_address_twobigints (
        id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
        haddr BIGINT UNSIGNED NOT NULL,
        laddr BIGINT UNSIGNED NOT NULL,
        UNIQUE uidx (haddr, laddr)
    );
    
    CREATE TABLE ipv6_address_decimal (
        id SERIAL NOT NULL AUTO_INCREMENT PRIMARY KEY,
        addr DECIMAL(39,0) NOT NULL UNIQUE
    );
    

    次に、各ネットワークのすべてのIPアドレスを選択し、応答時間を記録します。 twobigintsテーブルの平均応答時間は約1秒ですが、バイナリテーブルの平均応答時間は約100分の1秒です。

    クエリは次のとおりです。

    SELECT COUNT(*) FROM ipv6_address_twobigints
    WHERE haddr & NETMASK_HIGH = NETWORK_HIGH
    AND laddr & NETMASK_LOW = NETWORK_LOW
    
    SELECT COUNT(*) FROM ipv6_address_binary
    WHERE addr >= NETWORK
    AND addr <= BROADCAST
    
    SELECT COUNT(*) FROM ipv6_address_decimal
    WHERE addr >= NETWORK
    AND addr <= BROADCAST
    

    平均応答時間:

    グラフ:

    BINARY_InnoDB  0.0119529819489
    BINARY_MyISAM  0.0139244818687
    DECIMAL_InnoDB 0.017379629612
    DECIMAL_MyISAM 0.0179929423332
    BIGINT_InnoDB  0.782350552082
    BIGINT_MyISAM  1.07809265852
    


    1. Partition ByまたはMaxの使用方法は?

    2. SQLiteをJSONに変換する

    3. RETURNING from INSERT ...ONCONFLICTに除外された行を含める方法

    4. 複数でありながら相互に排他的な外部キー-これは進むべき道ですか?