1

クエリを含む Explain コマンド:

explain SELECT * FROM leituras 
WHERE categorias_id=75 AND 
textos_id=190304 AND 
cookie='3f203349ce5ad3c67770ebc882927646' AND 
endereco_ip='127.0.0.1' 
LIMIT 1

結果:

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra       
1      SIMPLE          leituras  ALL      (null)            (null)  (null)      (null)  1022597  Using where 

テーブルにいくつかのキーを追加しても違いはありますか? それでも、クエリは常に 1 行のみを返します。

4

3 に答える 3

3

あなたの質問に答えて、はい。必要に応じて、句に表示される列にインデックスを追加する必要があります ( @Col.Shrapnel に感謝WHEREします)。この場合、categorias_idtextos_idcookie、およびendereco_ip.

節で常に同じ 3 つの列を使用してクエリを実行する場合はWHERE、個々のインデックスを追加するよりも、3 つの列で構成されるインデックスを一度に追加する方が有益な場合があります。

于 2010-05-05T12:14:08.693 に答える
2

その 1 つの行が見つかるまで、テーブルに対して線形検索を実行する必要があります。したがって、インデックスを追加すると、パフォーマンスが著しく向上する可能性があります。

于 2010-05-05T12:13:14.653 に答える
1

はい、1 行だけを返したい場合は、インデックスがさらに重要になります。

行の半分を返し、データベース システムがテーブル全体をスキャンする必要がある場合でも、効率は 50% です。

ただし、1 行だけを返す必要があり、データベース システムが行を見つけるために 1022597 行をスキャンする必要がある場合、効率は非常に低くなります。

LIMIT 1一致する最初の行が見つかるとすぐに停止するという点で、ある程度の効率性は提供されますが、最初の行を見つけるために膨大な数のレコードをスキャンする必要があることは明らかです。

句の各列にインデックスを追加するとWHERE、データベース システムは基準に一致しない行をスキャンすることを回避できます。適切なインデックスを使用すると、Explain の行列が返される実際の行数に近づくことがわかります。

句内の 4 つの列すべてをカバーする複合インデックスを使用するWHEREと、インデックスが完全にカバーされるため、パフォーマンスがさらに向上し、スキャンが少なくなります。複合インデックスは大量のメモリを使用し、挿入のパフォーマンスに悪影響を与えるため、クエリの大部分が同じ列を繰り返し検索する場合、またはレコードをめったに挿入しない場合にのみ、複合インデックスを追加することをお勧めします。その特定のクエリが高速であることが重要です。

パフォーマンスを向上させるもう 1 つの方法は、 を使用するのではなく、必要な列のみを返すことですSELECT *。これらの 4 つの列に複合インデックスがあり、それらの 4 つの列のみを返す場合、データベース システムはレコードをヒットする必要はまったくありません。データベース システムは、インデックスから必要なものをすべて取得できます。

于 2010-05-05T12:33:22.000 に答える