データベースのインデックス作成


12

私はデータベースにあまり精通していませんが、現在、インデックス作成メカニズムを理解しようとしています。

私が知っていることから、RDBMSでは、列にインデックスを付けると、その列による検索が高速になります。これはトリプルストアにも当てはまります。インデックスのみが、主にサブジェクト、次にオブジェクトなどで検索することを想定しています。

RDBMSについてはわかりませんが、トリプルストアでは、複数のインデックスを定義して、各クエリに最適なインデックスをストアに選択させることができます(うまくいけばこの権利を理解できました)。当然、次の質問が表示されます。

可能性のあるすべてのインデックスをトリプルストアに追加し、RDBMSに拡張してはいけないのはなぜですか。各列にインデックスを作成しないのはなぜですか(私は怠zyではないと仮定して)。

回答:


25

基本的に、インデックスは余分なテーブルであり、プライマリキーはインデックスを作成するフィールドであり、コンテンツはメインテーブルのプライマリキーのみであるためです。したがって、すべての更新は、更新するフィールドを使用するすべてのインデックスで複製する必要があります。

これは、インサートで特に顕著です。テーブルに行ったすべての挿入を、他の20個のテーブルに複製する必要があると想像してください。それは痛々しいほど遅くなるだろう。

これは、複合インデックス、クラスタ化インデックス、およびフルテキストインデックスではさらに悪化することに注意してください。ただし、この問題をまだ複雑にしたくありません。


2

インデックスは基本的に追加のデータ構造であり、構築および保存する必要があります。indeを構築すると(書き込み操作中に)CPUパワーが無駄になり、保存するとディスク容量が無駄になります。

使用しないインデックスを作成して保存するのはなぜですか?


これは純粋に理論的な質問です(「what if / why not」)。
ドラゴ

@Dragosこれらの質問に対する答えは、私の投稿から明らかだと思います。そうすると、すべての書き込み操作が非常に遅くなり、すべてのレコードが多くのディスク容量を浪費します。何故なの?CPUパワーとディスクストレージは高価だからです。
マテイZábský

2

必要な場合にのみインデックスを配置します。私がデータベーススキーマを開発するときの経験則として、すべてのテーブルは、最初にPKプライマリキークラスター化インデックスを取得します。これは、そのテーブルのデータの一意の識別子になります。Inは1列または複数列にすることができます。

その後、通常、一意性を強制する列に非クラスター化一意インデックスを追加します。

これは基本スキーマです。アプリケーションが開発され、成熟するにつれて、パフォーマンスの懸念とデータのクエリ方法に基づいて、必要に応じてインデックスを追加します。

追加されるすべてのインデックスは、使用される間隔を増やし、さらにメンテナンスを追加します。したがって、インデックスを賢明に選択してください。


あなたの答えを読んでいると、別の質問が思い浮かびました。通常、主キーは自動的に索引付けされますか、それとも索引付けされるように指定する必要がありますか?たとえば、MySQLデータベースで言うと?
ドラゴ

はい、プライマリキーは(SQL Server)のクラスター化インデックスを自動的に作成する必要があります。主キーは1つだけなので、テーブルごとにクラスター化インデックスは1つだけです。MySQLは似ているはずですが、MySQLの専門家が検証できるかもしれません。
ジョンレイナー

2

インデックスの長所は、1)すばやく検索できるデータ構造と、2)実際のテーブルよりもコンパクトであり、ディスクにページングされるのではなく、より多くのインデックスがメモリに収まることです。

すべての列にインデックスがある場合、インデックス自体は、それらが表すテーブルよりも多くのスペースを使用します。データベースが実際にすべてのインデックスを使用している場合、インデックスをメモリにスワップインおよびスワップアウトするだけで時間がかかります。さらに、すべてのインデックスは、不活性、更新、または削除時に更新する必要があります。

それを超えて、単一の列のインデックスはあなたができる最高のものではありません。ほとんどのリレーションデータベースは、実際には複数の列のインデックスを許可し、これらの列の順序は重要です。たとえば、1980年から1984年の間にクラスからデュークに行ったすべての人のデータベースを検索する場合、(School、ClassYear)のインデックスが必要です。クエリは同じ列のインデックスを使用できませんが、逆になります。

したがって、可能なすべてのインデックスを作成するには、少なくともn!インデックスに列を配置する方法。5列のみの場合、120の可能なインデックスがあります。

考えられるインデックスは非常に多いため、アプリケーションにとってどのインデックスが有用かを判断し、それらだけを作成する必要があります。


しかし、あなたの例では、2つのインデックスがあります。1つはSchoolに、もう1つはClassYearにあります。
ドラゴ

@Dragosもちろんです。Class Year(2004年のクラスの学校に通ったすべての学生)を超えた別のクエリがある場合、Class Yearインデックスが役立つ場合があります。残念ながら、いつどのインデックスを使用するかを決定する際に、クエリエンジンが使用する要素が山ほどあります。データベースの半分の人が2004年に学校に行ったことが判明した場合、データベースインデックスを無視し、とにかくテーブル全体をスキャンします。これをうまく使いたい場合は、実行計画の
クリスピットマン

私が意味したのは、SchoolとClssYearに別々のインデックスがある場合、1980年から1984年の間にクラスからデュークに行ったすべての人を検索するときに役立ちますか?
ドラゴ

@Dragos特定のdbエンジンに依存します。たとえば、Postgresは、複数のインデックスの結果を交差させるために、ビットマップインデックススキャンと呼ばれるものを使用します。使用するインデックスを決定するのはクエリエンジン次第であり、これは常にデータベース固有です。
クリスピットマン

2

テーブル内のすべての列にインデックスを作成すると、通常、スペースが無駄になり、他の人が述べたように、挿入/更新操作が遅くなる可能性があります。インデックスを使用してクエリを高速化します。その列の値を照会するときにパフォーマンスの低下に気づいた場合にのみ、列にインデックスを追加することをお勧めします。

一部のデータベースでは、テーブルの主キーのインデックスが必要な場合があります。そのため、その主キーについて選択できない場合があります。また、非常に大きなテキスト列がある場合、フルテキスト検索およびインデックス用に設計された特定のテクノロジがありますが、小さな数値列に使用するのと同じ種類のインデックスとは限りません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.