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

ORDER BYを使用するときにMySQLがインデックスを使用しない(filesortを使用)

    この場合、RANGEを使用するため、インデックスを使用できません。 フィルタリング条件。

    次のようなものを使用する場合:

    SELECT  *
    FROM    values_table this_
    WHERE   this_.value1 = @value
    ORDER BY
            value2
    LIMIT 10
    

    、次に(VALUE1, VALUE2)に複合インデックスを作成します フィルタリングと注文の両方に使用されます。

    ただし、遠隔条件を使用するため、とにかく注文を実行する必要があります。

    複合インデックスは次のようになります:

    value1 value2
    -----  ------
    1      10
    1      20
    1      30
    1      40
    1      50
    1      60
    2      10
    2      20
    2      30
    3      10
    3      20
    3      30
    3      40
    

    、および1を選択した場合 および2 value1で 、まだvalue2のソートされたセット全体を取得することはできません 。

    value2のインデックスの場合 あまり選択的ではありません(つまり、DISTINCT value2は多くありません 表内)、次のことを試すことができます:

    CREATE INDEX ix_table_value2_value1 ON mytable (value2, value1)
    
    /* Note the order, it's important */    
    
    SELECT  *
    FROM    (
            SELECT  DISTINCT value2
            FROM    mytable
            ORDER BY
                    value2
            ) q,
            mytable m
    WHERE   m.value2 >= q.value2
            AND m.value2 <= q.value2
            AND m.value1 BETWEEN 13123123 AND 123123123
    

    これはSKIP SCANと呼ばれます アクセス方法。 MySQL 直接サポートしていませんが、このようにエミュレートできます。

    RANGE この場合、アクセスが使用されますが、DISTINCT value2でない限り、パフォーマンス上のメリットはおそらく得られません。 約1%未満で構成されます 行の。

    使用法に注意してください:

    m.value2 >= q.value2
    AND m.value2 <= q.value2
    

    代わりに

    m.value2 = q.value2
    

    これにより、MySQLが作成されます RANGEを実行します 各ループをチェックします。



    1. ユーザーのJavaJDBCアクセスが拒否されました

    2. MySQLスペースを監視する方法は?

    3. ADDMタスクを作成してそのレポートを確認する方法

    4. rownumを使用してテーブルの2番目の行を選択する