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

filesortを使用したMySQLの低速クエリ

    以下のクエリは、Usingtemporaryを削除します。 filesortを使用します。説明から、これはthoeryでより良く実行されるはずです。

    MySQLオプティマイザはばかげているので、必要なオプティマイザを強制するのがコツです。これは、college.college_location =1に基づく派生テーブルです。したがって、結果を学生テーブルと内部結合できます。このようにして、MySQLはソートキーを使用できます。

    SELECT 
     *
    FROM 
     student
    INNER JOIN (
        SELECT 
         college_id
        FROM 
         college
        WHERE
         college.college_location = 1  
      ) college
    ON student.student_college = college.college_id
    ORDER BY
        student.countup DESC
      , student.updated_time DESC
    

    CapsLockの新しいインデックスに注意してください

    デモを参照 http://sqlfiddle.com/#!2/05c8a/1

    または、より理にかなっている、または読みやすいと思われる場合は、これを使用できます。説明では同じであると説明されているため、パフォーマンスは同じである必要があります。

    SELECT 
     * 
    FROM (
      SELECT 
        college_id
      FROM 
        college
      WHERE
        college.college_location = 1  
    ) 
      college
    
    INNER JOIN
     student 
    
    ON
     student.student_college = college.college_id
    
    ORDER BY
        student.countup DESC
      , student.updated_time DESC
    

    デモを参照 http://sqlfiddle.com/#!2/05c8a/23

    新しい戦略の分割統治法 正しいインデックスを利用するためにデータベースに対してさらにクエリを実行し、一時テーブルとファイルソートの必要性を排除します。

    SET @college_ids = NULL; 
    
    SELECT
      GROUP_CONCAT(college_id)
    FROM
      college
    WHERE
      college_location = 1
    GROUP BY
      college_location ASC
    INTO @college_ids;
    
    SELECT 
     *
    FROM 
     student
    WHERE 
     student.student_college IN(@college_ids)
    ORDER BY
        student.countup DESC
      , student.updated_time DESC
    ;
    

    デモを参照 http://sqlfiddle.com/#!2/454b3/61



    1. SQLクエリがorderbyで機能しない

    2. 100,000以上のレコードで実行される'col=col + 1'UPDATEクエリを最適化する方法は?

    3. OracleでONCOMMITのトリガーを定義するにはどうすればよいですか?

    4. 損傷したSQLバックアップを修復するSQLバックアップリカバリツール-製品レビュー-ダニエルジョーンズによるゲスト投稿