SQL:主キーとインデックスは具体的に何をするのでしょうか?

StackOverflow https://stackoverflow.com/questions/1315481

  •  19-09-2019
  •  | 
  •  

質問

私は最近、SQL データベースを使用する初めての本格的なアプリケーションの開発を開始し、phpMyAdmin を使用してテーブルを設定しています。さまざまな列に追加できるオプションの「機能」がいくつかありますが、それらが何をするのか完全にはわかりません。

  • 主キー
  • 索引

PK の目的と使用方法は知っていますが、それに関する私の質問は、なぜ PK が必要なのかということだと思います。単に列を "Unique" に設定することと、次のことができるという事実以外はどう違うのですか? PKは1つだけですか?この値がレコードを一意に識別することをプログラマに知らせるだけでしょうか?それとも何か特別な性質も持っているのでしょうか?

「インデックス」が何をするのか全く分かりません。実際、これが使用されているのを見たことがあるのは、(1) 主キーにインデックスが付けられているように見えることと、(2) インデックスが何らかの形でパフォーマンスに関係していると聞いたことだけです。 ;インデックス付きの列は必要ですが、多すぎないようにします。どの列にインデックスを付けるかをどのように決定するのでしょうか?また、それは正確に何を行うのでしょうか?

編集: ORDER BY したいと思われる列にインデックスを付ける必要がありますか?

どうもありがとう、

マラ

役に立ちましたか?

解決

プライマリキーは通常、あなたの記録のための数値「ID」を作成するために使用され、このID列が自動的にインクリメントされます。

たとえば、あなたはbooksが主キーであり、あなたが最初のテーブルに本を追加するときも、その後、(phpmyadminの中に余分な「の下)idに設定されているidフィールド、とauto_incrementテーブルを持っている場合は、そのためのIDは、1' になります。次の本のIDが自動的にように「2」であること、およびでしょう。通常は、すべてのテーブルを特定し、簡単にレコードを見つけることを支援するために、少なくとも1つのプライマリキーを持っている必要があります。

あなたが定期的にテーブルから特定の情報を取得する必要がある場合にインデックスが使用されています。あなたはusersテーブルを持っている、とあなたはemail列をたくさんアクセスする必要があります場合たとえば、あなたは、電子メールにインデックスを追加することができ、これは、電子メールにアクセスするクエリがより速くなることになります。

しかしそこに不要なインデックスを追加するためのマイナス面もあり、これだけは本当に他の人よりも多くアクセスする必要のない列にこれを追加します。 MySQLは、各インデックス付きの列のための余分な情報を格納する必要があるとして、例えば、UPDATEDELETEINSERTクエリは、あなたが持っている複数のインデックス少し遅くなります。詳細情報は、このページで見つけることができます。

編集:はい、ORDER BYで使用する必要がある列がたくさんインデックスを持っているだけでなく、WHEREで使用されている必要があります。

他のヒント

の主キーは、基本的には、そのテーブル内の行の「公式」IDとして作用するユニークなインデックス・カラムです。最も重要なことは、一般的に別のテーブルは、最初の行を参照する場合、それはその行の主キーのコピーを含有するであろう、すなわち、外部キー関係のために使用されます。

が複合主キー、複数の列で構成され、すなわちいずれかを持つことが可能だということに注意してください。

インデックスは、検索時間を改善します。インデックスを介して特定の行を検索すると、完全なテーブルをスキャンするのではなく、(ログ(n))を時間Oをとるように、それらは、通常、ツリーベースています。

一般的に、頻繁WHEREORDER BY又は(特に)JOIN句で使用される大型の表のすべての列は、インデックスを有していなければなりません。インデックスはevey INSERTUPDATEまたはDELETEのために更新する必要があるので、それらの操作が遅くなります。あなたは、いくつかの書き込みと読み込みをたくさん持っている場合は、あなたの聞くのコンテンツへのインデックス。あなたは、両方の書き込みの多くと多くの列に索引を必要とするクエリの多くを持っている場合は、大きな問題があります。

主キーと一意キーの違いは、例を通して最もよく説明されます。

ユーザーのテーブルがあります。

USER_ID number 
NAME varchar(30)
EMAIL varchar(50)

このテーブルでは、USER_ID が主キーです。名前は一意ではありません。世界にはジョン・スミスやムハンマド・カーンがたくさんいます。EMAIL は必ず一意でなければなりません。そうしないと、世界中の電子メール システムが機能しません。そこで、EMAIL に一意の制約を設けました。

では、なぜ個別の主キーが必要なのでしょうか?3 つの理由:

  1. 数値キーは、スペースが少ないため、外部キー関係で使用するとより効率的です
  2. メールアドレスは変更される可能性があります(例: swapping provider) ですが、ユーザーは 今でも同じです。の変化を波打つ スキーマ全体の主キー値 いつも悪夢です
  3. 機密情報または個人情報を外部キーとして使用することは常に悪い考えです

リレーショナル・モデルでは、テーブルに存在し、一意の両方であることが保証されている列のセットの任意の列またはテーブルの候補キーと呼ばれることができます。 "現在" "NOT NULL" を意味します。これは、主キーとして候補キーのいずれかを指定するために、行に記載されている行全体に、又は主題の項目を参照するためにプライマリ・キーへの参照を使用するデータベース設計に一般的な方法です。

SQLでは、PRIMARY KEY制約は、各主キー列にNOT NULL制約、および一緒になって、すべての主キー列に対してUNIQUE制約になります。実際には、多くの主キーは、単一列であることが判明します。

ほとんどのDBMS製品では、PRIMARY KEY制約も自動的に主キー列の上に構築されたインデックスになります。これは、新しいエントリが新しい値が既存の値と重複しないことを確認するために、主キーのために作られたときに活動をチェックするシステムをスピードアップします。また、主キーの値に基づいて検索を高速化し、主キーとそれを参照する外部キーの間で結合します。どのくらいのスピードアップが発生すると、クエリオプティマイザがどのように機能するかに依存します。

与えられた

もともと、リレーショナルデータベースの設計者は、データ内の自然キーを探しました。近年では、傾向は常に最初の列とすべてのテーブルの主キーとしてIDと呼ばれる列、整数を作成することでした。 DBMSの自動生成機能は、このキーは一意であることを保証するために使用されます。この傾向は、「オスロの設計基準」に記載されています。それは必ずしも、リレーショナル設計ではありませんが、それはそれに従う人々のいくつかの当面のニーズを提供しています。私はこの方法はお勧めしませんが、私はそれが流行の練習であることを認識しています。

インデックスは、インデックス付けされたテーブルの列の記述に基づいて、テーブル内のいくつかの行への迅速なアクセスを可能にするデータ構造です。インデックスは、テーブルの行へのポインタが点在インデックスキーと呼ばれる特定のテーブル列のコピー、で構成されています。ポインタは、一般的にDBMSユーザーから隠されています。インデックスは、クエリオプティマイザと連携して動作します。ユーザーが求められているもののデータSQLで指定し、オプティマイザはインデックス戦略とそれを見つけるためのstategyに求められているものを翻訳するための他の戦略を思い付きます。 、ソートやハッシュなど、原理を整理するためのいくつかの種類があり、それは、高速検索、および特定の他の用途に使用するインデックスを可能にします。データベースビルダーは、インデックスを作成または主キーを宣言した後これは、すべてのDBMSの内部にあります。

インデックスは、主キーとは何の関係もないように構築することができます。これは一般的に非常に悪い考えですが、主キーは、インデックスなしで存在することができます。

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