1

私が貧乏人の検索エンジンを持っていて、製品の表を検索しているとしましょう...

select
  category_id
from products
where
  description like '%blue%'

私はあなたが何を考えているに違いないか知っています。先頭のワイルドカードを削除すると、クエリは説明のインデックスを適切に使用できます。それは私が求めているものではありません。

次のインデックスがある場合、クエリのパフォーマンスは向上しますか?

IX_description (description, category_id)

テーブル全体ではなくインデックスをスキャンするだけでよいと思いましたが、それは EXPLAIN が私に言っていることではありません。先頭のワイルドカードを削除すると、EXPLAIN の「余分な」フィールドはカバーされていることを示しますが、元に戻すとカバーされません。

description の使用方法が異なるにもかかわらず、category_id と description にのみアクセスしているため、両方のケースでカバーされるべきではありませんか?

編集:

商品が多対 1 の category_id である場合、このクエリは、書かれているように、あまり意味をなさないことに気付きました。DISTINCT が欠落しているため、正しいインデックスが作成されます

 IX_description (category_id, description)

これは実際にカバーされます。しかし、最初に述べたようにシナリオでカバーされていない理由を知りたい.

4

1 に答える 1

2

like クエリの両端でワイルドカードを使用しているため、通常、MySQL がインデックスを使用する意味はありません。いずれにせよ、完全なテーブル スキャンを実行するのは同じくらい高速です。

ただし...ここではインデックスのみのスキャンが可能なはずなので、テーブルに更新があるため、それを使用していないのではないかと思っています。または、単にクエリ プランが悪い可能性があるためです。

興味のある人のためのインデックスのみのスキャンに関するもう少しの情報: http://mysqlha.blogspot.nl/2010/11/how-are-index-only-scans-implemented-in.html

于 2012-06-12T23:18:25.757 に答える