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

複合インデックスはあるが主キーはないMysqlテーブル

    いくつかのポイント:

    テーブルについて現在ユニークなものを使用し、それを主キーとして作成しているようです。それはうまくいきます。また、自然キーには、局所性のためにクエリに関していくつかの利点があります。 (各ユーザーのデータは同じ領域に保存されます)。また、テーブルはそのキーによってクラスター化されているため、プライマリの列で検索している場合はデータの検索が不要になります。

    1. ただし、選択したような自然な主キーを使用すると、パフォーマンスにも欠点があります。

    2. 非常に大きな主キーを使用すると、主キーが各インデックス値に含まれるため、innodbで他のすべてのインデックスが非常に大きくなります。

    3. 自然な主キーの使用は、INSERTの代理キーほど高速ではありません。これは、大きいことに加えて、毎回テーブルの最後に挿入するだけでは不十分だからです。そのユーザーのセクションに挿入して投稿する必要があります。

    4. また、uが時間で検索している場合、時間が最初の列でない限り、自然キーを使用してテーブル全体を検索している可能性があります。代理キーは時間の経過とともにローカルになる傾向があり、一部のクエリには適切な場合があります。

    5. あなたのような自然キーを主キーとして使用することも、煩わしい場合があります。特定の投票を参照したい場合はどうなりますか?いくつかのフィールドが必要です。また、多くのORMで使用するのは少し難しいです。

    これが答えです

    更新やルックアップに使用できるため、innodbの内部主キーに依存するのではなく、独自の代理キーを作成して主キーとして使用します。

    ALTER TABLE tbl_rate 
    ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    ADD PRIMARY KEY(id);
    

    ただし、代理主キーを作成する場合は、キーも一意にします。同じコストですが、正確さを強制します。

    ALTER TABLE tbl_rate 
    ADD UNIQUE ( user_id, post_id, type );
    


    1. PostgreSQLタイムスタンプタイプでタイムゾーンを保持する

    2. MySQLの外部キーの正確な意味'削除制限'句

    3. 例外が発生したときにデータベース接続を閉じるための最適なデザインパターン

    4. フォルダからSQLServerに複数のCSVファイルをインポートする