14

MySQLのインデックス作成に関していくつか質問があります。

1)メモリに保存されているテーブルにインデックスを付けるときに速度が向上しますか?

2)列フィールドで一致するテーブルを検索する場合、すべての列にインデックスを付けると、インデックスの目的が損なわれますか?

どうもありがとう。

4

4 に答える 4

23

メモリまたはファイルシステムベースのテーブルにインデックスを付けると、その列に基づいて結果を選択または並べ替えるクエリが高速化されます。これは、インデックスがツリー構造のように機能 し、検索距離がツリーの深さに依存するためです。これは、列の行数(対数)よりもはるかにゆっくりと増加します。

すべての列にインデックスを付けることでインデックスの目的が損なわれることはありませんが、挿入と更新が遅くなります。これらの変更により、そのテーブルのすべてのインデックスが更新されるためです。また、インデックスはデータベースサーバー上のスペースを占有するため、考慮すべきもう1つの欠点があります。

この質問に関連して読むべき他のSOの質問:

インデックス作成のベストプラクティスインデックス
とはインデックスの
数で十分です

于 2010-07-09T08:52:24.577 に答える
2

1)もちろんです。
2)いいえ、インデックスの目的を損なうものではありません。mysqlはテーブルごとに複数のインデックスを使用できないことと、インデックスを追加すると挿入/更新/削除操作が遅くなることを覚えておいてください。したがって、使用されないインデックスを作成するのではなく、クエリに最適な複数列のインデックスを作成してください。

于 2010-07-09T08:51:02.340 に答える
0

ディスクスペースのインデックスのコストは、一般的に取るに足らないものです。多くの場合、テーブルが変更されたときにインデックスを更新するための追加の書き込みのコストは中程度です。追加のロックのコストは厳しい場合があります。

これは、テーブルの読み取りと書き込みの比率、およびクエリを高速化するためにインデックスが実際に使用される頻度によって異なります。

インデックスはディスクスペースを使用して保存し、作成と保守に時間がかかります。未使用のものは何のメリットもありません。クエリの候補インデックスが多数ある場合は、サーバーにクエリの「間違った」インデックスを選択させることで、クエリの速度が低下する可能性があります。

これらの要素を使用して、インデックスが必要かどうかを判断します。

通常、決して使用されないインデックスを作成することは可能です。たとえば、2つの可能な値しかない(nullではない)フィールドのインデックスは、ほぼ確実に役に立たないでしょう。

頻繁に実行されるアプリケーションが適切なインデックスを使用していることを確認し、必要以上のインデックスを作成しないように、独自のアプリケーションのクエリを説明する必要があります。

次のリンクをたどると、さらに多くの情報を入手できます。mysqlの場合:http ://www.mysqlfaqs.net/mysql-faqs/Indexes/What-are-advantages-and-disadvantages-of-indexes-in-MySQL

DB2の場合:http: //publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic = / com.ibm.db2.udb.doc / admin / c0005052.htm

于 2011-12-10T04:29:38.767 に答える
0

Q1に関して...クエリオプティマイザは、「完全に良好な」インデックスがある場合でも、テーブルをスキャンすることを選択することがあります。このトレードオフは複雑なアルゴリズムに基づいていますが、経験則として:

インデックスの約20%以上を使用する必要がある場合は、インデックスを無視してテーブルをスキャンする方が効率的であると見なされます。

この理由は次のとおりです。インデックスを使用するということは、インデックスBTree(テーブルに非常によく似ています)をスキャンしてから、データBTreeにジャンプしてレコードを見つけることを意味します。単にデータをスキャンするだけであれば、このようなやりとりは避けられます。欠点は、最大80%の行を無視する必要があることです。

当然の結果:「フラグ」(0/1、T / F、M / F、はい/いいえ)または低いカーディナリティ列(はい/いいえ/多分、M / F / etc、曜日、 ...)。

一方、カーディナリティの低い列で始まる複合インデックスがあると非常に便利な場合があります。

WHERE deleted=0 AND created_at > NOW() - INTERVAL 1 DAY
INDEX(deleted, created_at)
于 2019-02-06T19:32:28.447 に答える