私自身の調査から(ただし、私は専門家のDBAではありません)、複合キーインデックスの順序を決定する際に考慮すべきことが2つあることを学びました。
まず、列のカーディナリティに関して、インデックスは一般に、カーディナリティの高い列を検索するのに適しています。そのため、カーディナリティが最も高い列をインデックスの最初に配置する傾向があります。参考までに、<a rel="nofollow noreferrer noopener"href="https://www.informit.com/articles/article.aspx?p=377652">MySQLクエリ最適化 というタイトルの記事があります。 つまり:
あなたの場合、_id
列は明らかにその定義によりよく適合しているため、キーのプレフィックスとして適しています。
考慮すべきもう1つのことは、これらのインデックスの再利用性です。ほとんどの(すべてではないにしても)データベースシステムでは、複合キーのプレフィックスを再利用できます。たとえば、(owner_id, owner_type)
の複合キー owner_id
のクエリでも使用できます ただし、owner_type
にはありません 。
したがって、質問で説明したことから、2つのインデックスを使用したほうがよい場合があります。(owner_id, owner_type)
の複合キーインデックスです。 もう1つは(owner_type)
にあります 。
最後に、それは本当にすべてあなたのデータセットとクエリに帰着します。複数のシナリオ、さまざまな複合キーの順序を使用したベンチマークを試して、最適なソリューションを確認してください。また、インデックスにはテーブルへの書き込みペナルティが発生することを忘れないでください。
更新 :複合キーインデックスに関する別のかなり人気のあるSOの質問もあります: