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

8000万レコードのテーブルとインデックスの追加には、18時間以上(または永久に)かかります。それで?

    この問題は、テーブルを作成し、インデックスを作成して、問題を忘れるだけではないことがわかりました:)他の誰かが同じ問題に直面した場合に備えて、これが私がしたことです(IPアドレスの例を使用しましたが、他の問題でも機能しますデータ型も):

    問題:テーブルに数百万のエントリがあり、インデックスを非常に高速に追加する必要があります

    ユースケース: ルックアップテーブルに数百万のIPアドレスを格納することを検討してください。 IPアドレスの追加は大きな問題ではありませんが、IPアドレスのインデックスの作成には14時間以上かかります。

    解決策MySQLのPartitionin を使用してテーブルを分割します g戦略

    ケース#1:必要なテーブルがまだ作成されていない場合

    CREATE TABLE IPADDRESSES(
      id INT UNSIGNED NOT NULL AUTO_INCREMENT,
      ipaddress BIGINT UNSIGNED,
      PRIMARY KEY(id, ipaddress)
    ) ENGINE=MYISAM
    PARTITION BY HASH(ipaddress)
    PARTITIONS 20;
    

    ケース#2:必要なテーブルがすでに作成されている場合。 これを行うためにALTERTABLEを使用する方法があるようですが、私はまだこれに対する適切な解決策を見つけていません。代わりに、少し非効率的な解決策があります:

    CREATE TABLE IPADDRESSES_TEMP(
      id INT UNSIGNED NOT NULL AUTO_INCREMENT,
      ipaddress BIGINT UNSIGNED,
      PRIMARY KEY(id)
    ) ENGINE=MYISAM;
    

    このテーブルにIPアドレスを挿入します。次に、パーティションを使用して実際のテーブルを作成します。

    CREATE TABLE IPADDRESSES(
      id INT UNSIGNED NOT NULL AUTO_INCREMENT,
      ipaddress BIGINT UNSIGNED,
      PRIMARY KEY(id, ipaddress)
    ) ENGINE=MYISAM
    PARTITION BY HASH(ipaddress)
    PARTITIONS 20;
    

    そして最後に

    INSERT INTO IPADDRESSES(ipaddress) SELECT ipaddress FROM IPADDRESSES_TEMP;
    DROP TABLE IPADDRESSES_TEMP;
    ALTER TABLE IPADDRESSES ADD INDEX(ipaddress)
    

    そして、あなたは行き​​ます...新しいテーブルでのインデックス作成には、1GBのRAMを搭載した3.2GHzのマシンで約2時間かかりました:)これがお役に立てば幸いです。



    1. Postgresqlで同等のテーブル値パラメーター

    2. SQL Serverは、コンポーネント「OleAutomationProcedures」のプロシージャ「sys.sp_OACreate」へのアクセスをブロックしました

    3. WITHRECURSIVE句を使用して選択する方法

    4. MySQLクロスサーバー選択クエリ