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

2つの範囲条件を持つクエリのインデックス作成をどのように行う必要がありますか?

    IN =の間のようなものです および「範囲」。それで、私は質問のタイトルをいじくりまわします。 2つの範囲を最適化することは事実上不可能です。 IN さらに、範囲には最適化の可能性があります。

    に基づく

    WHERE `StartedAt` >= FROM_UNIXTIME(1518990000)  
    AND   `StartedAt` <  FROM_UNIXTIME(1518998400) 
    AND `DeviceId` IN (
        UNHEX('00030000000000000000000000000000'),
        UNHEX('000300000000000000000000000181cd'),
        UNHEX('000300000000000000000000000e7cf6'),
        UNHEX('000300000000000000000000000e7cf7'),
        UNHEX('000300000000000000000000000f423f')
    ) AND `MarkedForDeletion` = FALSE
    

    2つのインデックスを提供し、オプティマイザーにどちらを使用するかを決定させます。

    INDEX(MarkedForDeletion, StartedAt, DeviceId)
    INDEX(MarkedForDeletion, DeviceId, StartedAt)
    

    MySQL / MariaDBの一部の新しいバージョンは、2番目で飛躍して3つの列すべてを利用できます。 索引。すべてのバージョンで、いずれかのインデックスの最初の2列が候補になります。選択は統計に基づいて行われる場合があり、「正しい」選択である場合とそうでない場合があります。

    AlarmId以降 NULLにすることはできません 、パターンを使用します:COUNT(*)

    その変更を行った後、私の各インデックスは「カバー」しているため、パフォーマンスがさらに向上します。



    1. MySQLでBLOBをVARCHARに変換するにはどうすればよいですか?

    2. mysqlで単一のキーワードを使用して複数のテーブルから検索

    3. データベースサイズが2ギガバイトを超えると、SQLiteのパフォーマンスが低下しますか?

    4. PostgreSQLアクセント+大文字と小文字を区別しない検索