现在遇到一个性能问题,解决办法就是给字段加索引,现在纠结的是字段组合索引还是单个索引查询效率问题?
场景
现在查询字段是parentId,key ,两个字段同时查询。
现在见索引的方案是
1 分别给 parentId,key添加索引
2 建一个组合索引 {parentId:1,key:1}这样的方式:
这两个查询性能是不是差不多啊?
求证
伊谢尔伦2017-05-02 09:24:03
インデックスの効率という点では、複数のフィールドを使用してクエリを実行する場合、多くの場合、結合インデックスの使用を検討する必要があります。
しかし、物事が完全に絶対というわけではなく、インデックス作成のオーバーヘッドも考慮する必要があります。
条件を例として、key
がレコードを一意に決定できると仮定すると、parentId
を追加する必要はありませんか? key
能够唯一确定一条记录,parentId
是不是就没有必要加上了呢?
退一步,即使key
不能唯一确定一条,如果它能够把结果集确定在一定的小范围内,比如5条记录,10条记录,那parentId
一歩下がって、key
が一意に結果セットを決定できない場合でも、5 レコードや 10 レコードなどの特定の狭い範囲内で結果セットを決定できる場合は、parentId
この条件は、適切なレコードを見つけるためにこれらの 10 レコードを再度スキャンすることに他なりません。インデックスにレコードを追加することによって発生する書き込み、ストレージ、メモリのオーバーヘッドと比較すると、ユニオンにまったく入れないことを選択することもできます。インデックスにあります。
条件でフィルタリングできるレコードが多いほど、その「選択性」が向上します。通常の状況では、インデックスを作成するときは、選択性の高い条件を前に配置し、選択性の悪い条件を後ろに配置する必要があります。ひどい場合は入れないでください。
これは実際には時間と空間のバランスです。インデックスに条件を入れると、時間 (CPU 時間、クエリ時間を含む) とスペース (ストレージ領域、メモリスペースを含む) が決まります。インデックスに含めない条件は、時間とスペースの節約にかかります。ほとんどの場合、後者をいつ選択するかは、実際の状況に対するあなた自身の評価によって決まります。