不完全な仕様に基づいて、私はこれを行います:
CREATE UNIQUE INDEX stock_UX1 ON stock (storeid,seedid,stk)
このインデックスは、storeid
のインデックスの要件を満たします。 先頭の列として。 (これがInnoDBでstoreid
の場合、その要件があることはわかっています。 は外部キーです。)
このような短いテーブル行を使用して、先に進み、それをカバーインデックスにして、すべての列を含めます。そうすれば、基になるテーブルのデータページを検索せずに、インデックスページから直接クエリを実行できます。
(seedid,storeid)
がわかっているので は一意であり(主キーとして指定)、(storeid,seedid)
を知っています。 も一意であるため、インデックスをUNIQUEと宣言することもできます。
他の選択肢があります。上記のインデックスを作成する必要はありません。代わりにこれを行うことができます:
CREATE INDEX stock_IX2 ON stock (storeid)
ただし、これはほぼ同じ量のスペースを使用するため、可能な限り多くのクエリにはメリットがありません。
セカンダリインデックスには、テーブルのプライマリキーが含まれます。 2番目のインデックスにseedid
が含まれるようにします テーブルのPRIMARYKEYが指定された列。つまり、インデックスは次のようになります。
CREATE INDEX stock_IX3 ON stock (storeid,seedid)
また、これら2つの列の組み合わせは一意であることがわかっているため、UNIQUEキーワードを含めることができます
CREATE UNIQUE INDEX stock_UX4 ON stock (storeid,seedid)
フォームのクエリでEXPLAINを実行した場合
EXPLAIN
SELECT t.storeid
, t.seedid
, t.stk
FROM stock t
WHERE t.storeid = 'foo'
セカンダリインデックスで範囲スキャン操作が発生する可能性があります。ただし、stk
の値を取得する 列は、基になるテーブルのデータページを検索する必要があります。 stk
を含む セカンダリインデックスの列は、インデックスをカバーするにします。 クエリのインデックス。回答で最初に推奨されるインデックスを使用して、EXPLAIN
を期待します 「インデックスの使用」を表示する出力。