sql >> データベース >  >> RDS >> Mysql

重複する値を持つ列のインデックス作成

    不完全な仕様に基づいて、私はこれを行います:

       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を期待します 「インデックスの使用」を表示する出力。



    1. WindowsにMySQLをインストールする方法

    2. SQL Server 2012で相互適用を行う場合、および内部結合を行う場合

    3. レコードがない場合、MySQL SUMクエリがnullではなくゼロを返すようにするにはどうすればよいですか?

    4. トリガーを使用して挿入後に別のテーブルを更新しますか?