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

Group By /OrderByのMySQLインデックス

    これはあなたを助けるはずです。クエリを次のように書き直します。

    SELECT c1, Sum(c2) 
    FROM table 
    WHERE c4 = 2011 
    AND c5 = 0 
    AND c6 In (6,9,11)
    AND c3 IS NOT NULL   
    GROUP BY c1
    

    次に、列(c4、c5、c6)に、その順序で列を持つ複合インデックスを作成します。インデックスの列は、WHERE句の列と同じ順序で表示される必要があります。そうしないと、インデックスが機能しません。このインデックスの選択性は十分に狭いため、一時テーブル(group byの場合)のファイルソートは高速である必要があります。

    c3をクエリの最後に移動する理由は次のとおりです。例として、c3が0〜100の値を取ることができる(またはNULLになる可能性がある)と仮定します。 「ISNOTNULL」クエリを実行する場合、Mysqlは、NULLに対応するエッジを除くほとんどすべてのBツリーインデックスをトラバースする必要があります。したがって、MySQLは、インデックス内のすべての異なるパスをウォークスルーするよりも、全表スキャンの方が簡単なオプションであると判断します。一方、クエリが「IS NULL」であり、インデックスが(c3、c4、c5、c6)の場合、Mysqlは実際にこのインデックスを使用することがわかります。これは、この場合、MysqlがNULL値に対応するインデックスツリーの部分をトラバースするだけでよいためです。

    MySQLに必要なインデックスの種類は、問題のクエリに大きく依存します。 @louisが提案したように、すべての列にインデックスを作成することはお勧めできません!



    1. 式に基づいてmysql列の値を入力する方法は?

    2. SQLクエリデータをExcelにエクスポートする

    3. MySQLで正規表現とUPDATEを組み合わせて、FirstnameLastnameにスペースを追加する方法

    4. PostgreSQL DigitalOceanのパフォーマンスと価格の比較–ScaleGridとDigitalOceanマネージドデータベース