SQLのインデックスとは何ですか?


439

SQLのインデックスとは何ですか?明確に理解するために説明または参照できますか?

インデックスはどこで使用すればよいですか?

回答:


377

インデックスは、データベース内の検索を高速化するために使用されます。MySQLには、この件に関する優れたドキュメントがあります(他のSQLサーバーにも関連します):http : //dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

インデックスを使用すると、クエリの一部の列に一致するすべての行を効率的に見つけ、テーブルのそのサブセットのみをウォークスルーして完全に一致するものを見つけることができます。WHERE句の列にインデックスがない場合、SQLサーバーはテーブル全体を調べてすべての行をチェックし、一致するかどうかを確認する必要があります。これは大きなテーブルでは処理が遅くなる可能性があります。

インデックスはインデックスにすることもUNIQUEできます。つまり、その列に重複する値を含めることはできません。また、PRIMARY KEY一部のストレージエンジンでは、データベースファイルのどこに値を格納するかを定義します。

MySQLではEXPLAINSELECTステートメントの前でを使用して、クエリがインデックスを使用するかどうかを確認できます。これは、パフォーマンスの問題のトラブルシューティングに適したスタートです。詳細はこちら:http : //dev.mysql.com/doc/refman/5.0/en/explain.html


「インデックスはUNIQUEインデックスにすることもできます...」確認のために、それはインデックスが非UNIQUEになる可能性があるということですか?いつもユニークだと思っていました。私はSQLにかなり
慣れ

@DanielKurniadiほとんどのインデックスは一意ではありません。私はユーザーデータベースを持っていて、ヨーテボリに住んでいるすべての人を検索したいとします。「city」フィールドのインデックスは、私のクエリを高速化します。しかし、ヨーテボリには1人以上のユーザーが住んでいるため、インデックスは一意である必要があります。
EmilVikström

174

クラスタ化インデックスは、電話帳の内容のようなものです。この本を「ヒルディッチ、デビッド」で開いて、「ヒルディッチ」のすべての情報を隣り合わせで見つけることができます。ここでは、クラスター化インデックスのキーは(姓、名)です。

これにより、すべてのデータが互いに隣接しているため、クラスター化インデックスは、範囲ベースのクエリに基づいて大量のデータを取得するのに最適です。

クラスタ化インデックスは実際にはデータの格納方法に関連しているため、テーブルごとに可能なインデックスは1つだけです(ただし、複数のクラスタ化インデックスをシミュレートすることはできます)。

非クラスター化インデックスは、それらの多くを保持でき、クラスター化インデックス内のデータを指すという点で異なります。たとえば、(町、住所)をキーとする電話帳の後ろに非クラスター化インデックスを配置できます。

「ロンドン」に住んでいるすべての人を電話帳で検索する必要がある場合を想像してみてください。クラスタ化インデックスのみでは、クラスタ化インデックスのキーがオンになっているため、電話帳のすべての項目を検索する必要があります(姓、 firstname)そしてその結果、ロンドンに住んでいる人々はインデックス全体にランダムに散らばっています。

(町)に非クラスター化インデックスがある場合、これらのクエリははるかに迅速に実行できます。

お役に立てば幸いです。


151

非常に良い例えは、データベースインデックスを本のインデックスと考えることです。国に関する本をお持ちでインドをお探しの場合、本の後ろにあるインデックスに移動するだけで、なぜ本全体をめくることができますか?あなたがインドに関する情報を見つけることができる正確なページを教えてくれる本。同様に、ブックインデックスにはページ番号が含まれているため、データベースインデックスには、SQLで検索している値を含む行へのポインターが含まれています。

詳細はこちら


2
「アナログ」を使って物事を説明している経験豊富な人には感心します。+1
snr

82

インデックスは、クエリのパフォーマンスを向上させるために使用されます。アクセス/スキャンする必要のあるデータベースデータページの数を減らすことで、これを実現します。

SQL Serverでは、クラスター化インデックスがテーブル内のデータの物理的な順序を決定します。テーブルごとにクラスター化インデックスは1つしか存在できません(クラスター化インデックスはテーブルです)。テーブルの他のすべてのインデックスは、非クラスター化と呼ばれます。


49

インデックスはすべて、データをすばやく見つけることに関するものです。

データベース内のインデックスは、本で見つけるインデックスに似ています。本に索引がある場合、その本の章を見つけるようにお願いすると、索引の助けを借りてすばやく見つけることができます。一方、本に索引がない場合は、本の最初から最後まですべてのページを見て、章を探すのに多くの時間を費やす必要があります。

同様に、データベースのインデックスは、クエリがデータをすばやく見つけるのに役立ちます。インデックスを初めて使用する場合は、次のビデオが非常に役立ちます。実際、私は彼らから多くを学びました。

インデックスの基本
クラスタ化インデックスと非クラスタ化インデックス
一意の インデックスと非一意のインデックスインデックスの
利点と欠点


すべての答えを読んで、なぜすべてを索引付けしないのかと不思議に思いました。欠点を含むリンクを含めるための+1。
Lakshay Garg 2018

@LakshayGarg不必要なインデックス作成によってクエリの実行時間が遅くなる場合があるため、すべてのインデックス作成を試みるべきではありません。すべてがそうであるように、それはそれ自身の長所と短所です。
Gaurav Rajdeo

@LakshayGarg Gaurav Rajdeoは正しいです。同じ類推を維持します。本のすべての章、図、または表に索引を付けたいが、すべての段落、文、または単語には索引を付けたくない場合があります。通常、それはやり過ぎであり、不必要な複雑化につながります。これがこの回答で描かれた絵に十分近いことを願っています。
コリディア

23

まあ一般的にインデックスはB-treeです。インデックスには、クラスター化と非クラスター化の2つのタイプがあります。

クラスタ化インデックスは、行の物理的な順序を作成します(1つだけであり、ほとんどの場合それは主キーでもあります-テーブルに主キーを作成する場合、このテーブルにクラスタ化インデックスも作成します)。

非クラスター化インデックスもバイナリツリーですが、行の物理的な順序は作成されません。したがって、非クラスター化インデックスのリーフノードには、PK(存在する場合)または行インデックスが含まれます。

インデックスは、検索の速度を上げるために使用されます。なぜならO(log N)の複雑さだからです。インデックスは非常に大きく興味深いトピックです。大規模なデータベースにインデックスを作成することは、ある種の芸術であると言えるでしょう。


6
一般に、それは二分木ではなくbツリーです。
ミッチウィート

したがって、インデックスは自己均衡ツリーを使用するため、行を追加/削除するたびにそれ自体が均衡化され、挿入/削除のコストが高くなります...正しいですか?
David Refaeli

20

INDEXES -データを簡単に見つける

UNIQUE INDEX -重複する値は許可されていません

構文 INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

構文 UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

13

最初に、通常の(インデックス付けなしの)クエリの実行方法を理解する必要があります。基本的には、各行を1つずつトラバースし、データを見つけると戻ります。次の画像を参照してください。(この画像は、このビデオから取得されました。)

インデックスなし したがって、クエリが50を見つけるとすると、線形検索として49レコードを読み取る必要があります。

次の画像を参照してください。(この画像はこのビデオから取得されました)

ここに画像の説明を入力してください

インデックスを適用すると、クエリは、バイナリ検索のように各トラバーサルでデータの半分を削除するだけで、データを1つも読み取らずにすばやくデータを見つけます。mysqlインデックスは、すべてのデータがリーフノードにあるBツリーとして格納されます。


12

INDEXは、データ取得プロセスを高速化するパフォーマンス最適化手法です。これは、テーブル(またはビュー)からデータを取得する際のパフォーマンスを向上させるために、テーブル(またはビュー)に関連付けられた永続的なデータ構造です。

インデックスベースの検索は、クエリにWHEREフィルターが含まれている場合に特に適用されます。それ以外の場合、つまり、WHEREフィルターのないクエリは、データ全体とプロセスを選択します。INDEXなしでテーブル全体を検索することは、テーブルスキャンと呼ばれます。

Sql-Indexesの正確な情報は、明確で信頼できる方法で見つかります。次のリンクをたどってください:

  1. cocnept-wiseの理解のために:http ://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. 実装に関する理解:http : //dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html

6

インデックスは、いくつかの異なった理由のために使用されています。主な理由は、クエリを高速化して、行を取得したり、行をソートしたりできるようにするためです。別の理由は、他の列が同じ値を持たないことを保証する主キーまたは一意のインデックスを定義することです。


6

SQL Serverを使用している場合、最高のリソースの1つは、インストールに付属する独自のBooks Onlineです。これは、SQL Server関連のトピックについて最初に参照する場所です。

それが実用的であれば、「どうすればよいですか?」一種の質問であれば、StackOverflowを使用するのが適切です。

また、私はしばらく前に戻っていませんが、sqlservercentral.comはSQL Server関連のトップサイトの1つでした。


0

インデックスはon-disk structure associated with a table or view that speeds retrieval of rows from the table or viewです。インデックスには、テーブルまたはビューの1つ以上の列から構築されたキーが含まれます。これらのキーは、SQL Serverがキー値に関連付けられた1つまたは複数の行をすばやく効率的に検索できるようにする構造(Bツリー)に格納されます。

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

プライマリキーを構成すると、クラスター化インデックスが既に存在しない限り、データベースエンジンはクラスター化インデックスを自動的に作成します。既存のテーブルにPRIMARY KEY制約を適用しようとし、クラスター化インデックスがそのテーブルに既に存在する場合、SQL Serverは非クラスター化インデックスを使用して主キーを適用します。

インデックス(クラスター化されたものとクラスター化されていないもの)の詳細については、こちらを参照してください 。 sql-server-ver15

お役に立てれば!

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