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

外部キーを持つmySQLテーブルを分割しますか?

    パーティション化されたテーブルの行のサイズが、パーティション化が必要な理由である程度によって異なります。

    行サイズが小さく、分割の理由が純粋な数である場合 行の数が多い場合は、どうすればよいかわかりません。

    行サイズが非常に大きい場合は、次のことを考慮しましたか?

    P パーティション化されたテーブルであり、F 外部キーになる可能性のあるテーブルで参照されます。新しいテーブルXを作成します :

    CREATE TABLE `X` (
        `P_id` INT UNSIGNED NOT NULL,
            -- I'm assuming an INT is adequate, but perhaps
            -- you will actually require a BIGINT
        `F_id` INT UNSIGNED NOT NULL,
        PRIMARY KEY (`P_id`, `F_id`),
        CONSTRAINT `Constr_X_P_fk`
            FOREIGN KEY `P_fk` (`P_id`) REFERENCES `P`.`id`
            ON DELETE CASCADE ON UPDATE RESTRICT,
        CONSTRAINT `Constr_X_F_fk`
            FOREIGN KEY `F_fk` (`F_id`) REFERENCES `F`.`id`
            ON DELETE RESTRICT ON UPDATE RESTRICT
    ) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci
    

    そして重要なのは、テーブルPに行を追加するためのストアドプロシージャを作成することです。 。ストアドプロシージャは、行がテーブルPに追加されるたびに、確実に(トランザクションを使用して)確認する必要があります。 、対応する行がテーブルXに追加されます 。 Pに行を追加することを許可してはなりません 「通常の」方法で!行を追加するためにストアドプロシージャを使用し続ける場合にのみ、参照整合性が維持されることを保証できます。 Pから自由に削除できます ただし、通常の方法で。

    ここでの考え方は、テーブルのX 十分に小さい行があるので、多くの行がありますが、パーティションを作成する必要はありません。それでも、テーブルのインデックスはかなりの量のメモリを消費すると思います。

    Pをクエリする必要がある場合 外部キーでは、もちろんXをクエリします 代わりに、外部キーが実際にある場所です。



    1. 特定の順序でmysqlクエリ結果を一覧表示する方法は?

    2. TomcatJDBCプールに十分なアイドル接続がありません

    3. ストアド プロシージャで動的 SQL から結果を取得する

    4. 1つのUPDATESQLステートメントで複数の更新を実行することは可能ですか?