rdbmssの「インデックス」とはどういう意味ですか? [閉まっている

dba.stackexchange https://dba.stackexchange.com/questions/46

  •  15-10-2019
  •  | 
  •  

質問

私はほとんどの開発者のようなインデックスを使用しています(主に... well!index)が、インデックスを使用してデータベースを最適化する微妙な方法がたくさんあると確信しています。 DBMSの実装に固有のものかどうかはわかりません。

私の質問は、インデックスの使用方法の良い例(基本的で明らかなケースを除く)であり、テーブルのインデックスを指定するときにDBMSがデータベースを最適化する方法は何ですか?

役に立ちましたか?

解決

インデックスは「目次」と考えてください...これは、ファイル内の位置、別名オフセットへのポインターの順序付けられたリストです。一致する基準をテーブルに検索するのではなく、テーブルに数百万のレコードが保存されていると言ってください。一致の順序リストを参照し、特定のマッチング行にポインターを積み重ねる方がはるかに速いとします。インデックスの完璧な例は、テーブルのプライマリキーフィールド、最も一般的には「ID」フィールドです。行ID#11234566が必要な場合は、ポジション11234566のデータソースをスキャンするよりも、データへのポインターをインデックスに尋ねるのははるかに高速です。

これは、インデックス作成のそれほど明白ではない使用です。

CREATE TABLE activity_log (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
activity_type_id SMALLINT UNSIGNED NOT NULL,
datetime_created DATETIME
KEY(activity_type_id),
PRIMARY KEY(id)
);
CREATE TABLE activity_log_to_date_key (
activity_log_id INT UNSIGNED NOT NULL,
date_created_key  INT UNSIGNED NOT NULL REFERENCES dim_datetime(id),
UNIQUE KEY(activity_log_id),
KEY(date_created_key)
);
CREATE TABLE dim_datetime (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_hour DATETIME NOT NULL,
PRIMARY KEY(id),
KEY(date_hour)
);

操作はログレコードを作成できますが、ログテーブルよりも検索/ソートが速いインデックス付きデータタイムへの参照を作成します。次に、ログテーブルを独自の主キーに戻します。これを拡張する必要がある場合は、私に知らせてください。これが理にかなっていることを願っています。

サンプルクエリ:

SELECT a.activity_log_id, al.activity_type_id, al.datetime_created
FROM activity_log_to_date_key a 
INNER JOIN dim_datetime d ON (d.id = a.date_created_key)
LEFT JOIN activity_log al ON (al.id = a.activity_log_id)
WHERE d.date_hour BETWEEN '2009-01-01 00:00:00' AND '2009-06-01 12:00:00';

他のヒント

多くの人が見逃しているように見える1つのポイントは、DBMがクエリでテーブル参照ごとに1つのインデックスのみを使用することが多い(またはできる)ことが多く、複数のインデックスを使用できる場合と使用する場合、複合を使用することはおそらくより速いと思われることです。存在する場合はインデックス。

たとえば、行を大きなテーブルで検索する場合 WHERE AnIntegerColumn = 42 AND AnOtherInt = 69 これらの行への最速のルートは、2つの列AnintegerColumnとAnotherIntのインデックスです。個別に各インデックスのみがあるが、結合されたインデックスがない場合、DBは1つまたは他のインデックスを検索し、結果を2番目の句で個別にフィルタリングするか、その両方をスキャンしてその後結果を結婚させます。

複合インデックスで改善できる別の一般的な単純な操作は WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn - Somecolumnとsomeothercolumn(正しい順序で)にインデックスがある場合、状況によっては、フィルタリングおよび順序付け操作を同時に実行できます。

インデックスを追加することは、インデックスを保存するために使用される余分なスペース(およびDBが多くの書き込み操作を見た場合にそれらを維持するためにIOロードを維持する)が、わずかに最適ではない読み取りクエリよりも悪い問題になる可能性があるため、悪い最適化になる可能性があります。 、それをやりすぎないでください。

デビッドとランディはこれをカバーしています。私はそれを追加したかっただけです EXPLAIN 指図 インデックスの作成から大きな節約を得ることをいつ把握するか、どのインデックスが必要かを提案するのに、大きな助けになる可能性があります。データベースがクエリを実行するために取っている手順を表示するため、どのビットが最も長い時間をかけているかがわかります。

ここで私がまだ見たことがないのは、複数のディスクを持っている場合、おそらくデータが実際にある場所とは別のディスクにインデックスを配置したいということです。これにより、一部の操作をスピードアップできます。これは、それ自体が正しい質問に値すると思います。

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top