0

に関するMySQLのドキュメントによるとOptimizing Queries With Explain

* ALL: 前のテーブルの行の組み合わせごとに、フル テーブル スキャンが実行されます。テーブルが const とマークされていない最初のテーブルである場合、これは通常良くありません。通常、他のすべての場合は非常に悪いです。通常、定数値または以前のテーブルの列値に基づいてテーブルから行を取得できるインデックスを追加することで、ALL を回避できます。

これは、ALL を使用するクエリを最適化して、完全なテーブル スキャンを実行しないようにすることを意味しますか?

つまり、テーブルに正しいインデックスを追加することで、常に ALL の使用を避けることができるのでしょうか? または、追加するインデックスに関係なく、ALL が避けられない場合がありますか?

4

2 に答える 2

2

適切なインデックスを作成することで、フル スキャンを回避するために 1 つのクエリを最適化することは、ほとんどの場合 (フル スキャンを実行する方が実際には安価な場合があります) 可能です。ただし、同じテーブルに対して複数のクエリを実行すると、それらの一部がフルスキャンを実行するか、テーブルに列がある場合よりも多くのインデックスが作成されるシナリオがあります:-)

于 2009-07-28T19:57:36.733 に答える
1

はい、適切なインデックスを作成するのが難しいクエリがいくつかあります。例えば:

SELECT * FROM mytable WHERE colA * arg0 - colB > arg1

しかし、なぜそのようなクエリを作成したいのか完全にはわかりません:)

とはいえ、インデックスが多すぎると、キャッシュ メモリとディスク領域がさらに消費され、更新と挿入が遅くなります。

于 2009-07-28T20:02:11.577 に答える