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

MySQLカバーvsコンポジットvs列インデックス

    カバーリングインデックスは、複合インデックスと同じではありません。

    1つはcol3に、もう1つはcol4に2つの個別のインデックスがある場合、このクエリで使用されるインデックスはどれですか。

    カーディナリティが最も高いインデックス。
    MySQLは、どのインデックスがどのプロパティを持っているかに関する統計を保持します。
    最も識別力のあるインデックス(MySQLの統計で明らかなように)が使用されます。

    クエリ内のテーブルごとに1つのインデックスのみが使用されていることをどこかで読みました。これは、クエリで両方のインデックスを使用する方法がないことを意味しますか?

    副選択を使用できます。
    または、col3とcol4の両方を含む複合インデックスを使用することをお勧めします。

    次に、col3とcol4の両方を一緒に使用して複合インデックスを作成したが、WHERE句でcol3のみを使用した場合、パフォーマンスが低下しますか?例:

    複合インデックス
    正しい用語はcompoundです 複合ではなくインデックス。
    左端のみ 複合インデックスの一部が使用されます。
    したがって、インデックスが

    として定義されている場合
    index myindex (col3, col4)  <<-- will work with your example.
    index myindex (col4, col3)  <<-- will not work. 
    

    参照: http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html

    左端のフィールドを選択すると、where句でインデックスのその部分を使用しないで済むことに注意してください。
    複合インデックスがあると想像してください

    Myindex(col1,col2)
    
    SELECT col1 FROM table1 WHERE col2 = 200  <<-- will use index, but not efficiently
    SELECT * FROM table1 where col2 = 200     <<-- will NOT use index.  
    

    これが機能する理由は、最初のクエリがカバーインデックスを使用してスキャンを実行するためです。
    2番目のクエリはテーブルにアクセスする必要があるため、インデックスは意味をなさないのにスキャンします。
    これInnoDBでのみ機能します。

    カバーインデックスとは
    カバーインデックスとは、クエリで選択されたすべてのフィールドがcovered場合を指します。 インデックスによって、その場合、InnoDB(MyISAMではない)はテーブル内のデータを読み取ることはなく、インデックス内のデータのみを使用するため、選択が大幅に高速化されます。
    InnoDBでは、プライマリキーがに含まれていることに注意してください。すべてのセカンダリインデックス、つまりすべてのセカンダリインデックスは複合インデックスです。
    これは、InnoDBで次のクエリを実行した場合:

    SELECT indexed_field FROM table1 WHERE pk = something
    

    MySQLは常にカバーインデックスを使用し、実際のテーブルにはアクセスしません。 カバーインデックスを使用することもできますが、PRIMARY KEYを優先します 1行だけヒットする必要があるためです。



    1. SQLite JSON_REPLACE()

    2. SQL Server(TSQL)-ステートメントを並行して実行することは可能ですか?

    3. mysqldumpからの出力をより小さなファイルに分割するにはどうすればよいですか?

    4. Android Studio 3.0カナリア1:SQL構文エラー