いくつかのポイント:
テーブルについて現在ユニークなものを使用し、それを主キーとして作成しているようです。それはうまくいきます。また、自然キーには、局所性のためにクエリに関していくつかの利点があります。 (各ユーザーのデータは同じ領域に保存されます)。また、テーブルはそのキーによってクラスター化されているため、プライマリの列で検索している場合はデータの検索が不要になります。
-
ただし、選択したような自然な主キーを使用すると、パフォーマンスにも欠点があります。
-
非常に大きな主キーを使用すると、主キーが各インデックス値に含まれるため、innodbで他のすべてのインデックスが非常に大きくなります。
-
自然な主キーの使用は、INSERTの代理キーほど高速ではありません。これは、大きいことに加えて、毎回テーブルの最後に挿入するだけでは不十分だからです。そのユーザーのセクションに挿入して投稿する必要があります。
-
また、uが時間で検索している場合、時間が最初の列でない限り、自然キーを使用してテーブル全体を検索している可能性があります。代理キーは時間の経過とともにローカルになる傾向があり、一部のクエリには適切な場合があります。
-
あなたのような自然キーを主キーとして使用することも、煩わしい場合があります。特定の投票を参照したい場合はどうなりますか?いくつかのフィールドが必要です。また、多くの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 );