|
脱線失礼。
> インデックスの付与でここまで劇的に変わるものなのかと正直驚いております。 インデックスを付けていない表を SELECT で取り出すと、たいていの場合、INSERT した順に表示されます。これを見て、「テーブルには、データが登録された順に格納されている」と、“勘違い”している人が多く見られます。 データベースが扱うのは、データの集合です。この“集合”に、“順序”というものはありません。袋の中にあるボールを取り出しながら、何らかの条件に従っているかどうか見分けるようなものです。この説明だと、SELECT するごとに表示される順序は異なる事になります。実際、INSERT, DELETE を繰り返すと、取り出す順序が異なる現象に出くわします。 さて、インデックスを付けると、その「順序のない集合」に順序を付けることになります。そして、付けた順序に従って分類がされている状態になります。そうすると、インデックスが付いていることで、インデックスを元にした取り出しが早くなることが理解できるでしょうか。
ところが、何でもかんでもインデックスを付ければいいというものではありません。インデックスが付いている以上、どこかでインデックスを更新することが必要になります。この更新のタイミングは、たいてい、INSERT, DELETE, UPDATE が行われたときになります。その為、インデックスが付いた表を更新すると(インデックスに指定されている項目を更新すると)、インデックスの更新を行うために、若干時間がかかります。 この、「更新処理で、インデックスの更新に若干時間がかかる」ことを理由に、「インデックス使用禁止」という人がいます。import するときにも、かなり時間をとられますし(設定で、一時的に無効に出来る)。しかし、実際には、表に対する取得と更新のどちらが多いのか、どの程度の時間がかかることが許されるのか、などを考慮して、インデックスを作成するべきです。参照することはほとんど無い、記録としての意味しかないような表であれば、インデックスを作成する必要はないでしょう。反対に、マスター表であれば、注意深くインデックスを作成しておく方がよいでしょう。
|