1

MySql でのインデックス作成がどのように機能するかを理解したかったのです。インデックス作成に関していくつか質問があります。

まず、一意の値のみを持つ列にインデックスを付ける必要がありますか、または値が繰り返される列にインデックスを付けることができますか? 苗字。姓をインデックス化するのはばかげていることはわかっていますが、それがどのように機能するかを理解したいと思っています。これで分かるのは…

例えば。テーブルには 1000 レコードあります。そして400の姓が繰り返されています。したがって、「lastname」にインデックスを付けると、mysql はすべての一意の値を取得してそれらにインデックスを付けます。検索クエリが起動されると、1000 レコードを検索する代わりに、繰り返し値を含む 600 のインデックス付きレコードを 1 回だけ通過します。時間を節約。

何かのようなもの.....

苗字 :-

スミス

ジョンソン

ジョーンズ

茶色

デイビス

スミス //繰り返す

ジョンソン//繰り返す

スミス //繰り返す

BROWN //繰り返す

ウィリアムズ

MySql インデックス

  1. スミス

  2. ジョンソン

  3. ジョーンズ

  4. 茶色

  5. デイビス

  6. ウィリアムズ

私は正しいですか....?

4

3 に答える 3

2

あなたの前提はやや正しいです。ルックアップを実行するパフォーマンスのインデックスの利点(SELECT)。(一意の名前の数に関係なく)1,000の名前のリストがあり、「Smith」に等しい名前を見つけたい場合は、1,000行すべてを調べて、どのエントリ(存在する場合)がクエリ。これは、(一意の行の数に関係なく)行数に基づいてパフォーマンスが低下するため、非常に遅くなる可能性があります。

ここで、名前が姓のアルファベット順になっていると想像してください。「Smith」という名前のエントリを検索する場合は、「バイナリ検索」を実行できます。真ん中のエントリを選択し、アルファベット順に「Smith」より大きいか小さいかを確認します。それより少ない場合は、名前の前半を破棄し、後半のみを処理します。残りの名前の真ん中のエントリを選択して、Smithなどと比較します。

あなたがしたことはあなたの検索時間を短縮します。これで、「Smith」を見つけるためにn個のエントリすべてをチェックする必要はなく、log(2)nエントリをチェックするだけで済みます。これは、nの値が大きい場合ははるかに小さくなる可能性があります。

これは基本的にインデックスが行うことですが、役立つB +ツリー(上記のバイナリツリーアプローチに似ていますが、いくつかの特別なプロパティがあります)を使用することがよくあります。

一意性の質問に関しては、はい、一意でない列にインデックスを適用できます。インデックスがないと、列の一意性を維持するのに非常にコストがかかる可能性があるため、インデックスは一意である必要がある列(主キーなど)でよく使用されます。たとえば、「Smith」という名前のエントリを追加したいが、[LastName]列に一意の制約があるとします。「Smith」という名前のエントリがすでにあるかどうかをどうやって知ることができますか?あなたはそれを検索する必要があります。インデックスがない場合は、n個のエントリを調べる必要があります。インデックス付きの場合、log(2)nのみ。したがって、パフォーマンスを合理的に保つために、通常は一意の列にインデックスを保持することをお勧めします。

また、データベースインデックスに関するウィキペディアの記事は、あなたの質問にさらに詳しく答えます。

于 2012-04-12T14:44:15.157 に答える
-1

MySQLマニュアルの「最適化とインデックス」セクションをお読みください。

于 2012-04-12T14:44:42.977 に答える