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

このSELECTクエリは終了するのに180秒かかります

    (私のコメントを回答として投稿すると、明らかに違いが生じました!)

    誰かがこれをさらに調査したい場合は、テストを行ったところ、再現が非常に簡単であることがわかりました。

    テーブルの作成

    CREATE TABLE `filler` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (`id`)
    ) 
    

    プロシージャの作成

    CREATE PROCEDURE `prc_filler`(cnt INT)
    BEGIN
            DECLARE _cnt INT;
            SET _cnt = 1;
            WHILE _cnt <= cnt DO
                    INSERT
                    INTO    filler
                    SELECT  _cnt;
                    SET _cnt = _cnt + 1;
            END WHILE;
    END
    

    テーブルにデータを入力

      call prc_filler(5000)
    

    クエリ1

    SELECT id 
    FROM filler 
    WHERE id =  (SELECT MAX(id) FROM filler  WHERE id =   
     ( SELECT MIN(id) 
        FROM filler
        WHERE id between 2000 and 3000
        )
      )
    

    Equals ExplainOutputhttp://img689.imageshack.us/img689/5592/equals。 png

    クエリ2(同じ問題)

    SELECT id 
    FROM filler 
    WHERE id in  (SELECT MAX(id) FROM filler  WHERE id in   
     ( SELECT MIN(id) 
        FROM filler
        WHERE id between 2000 and 3000
        )
      )
    

    ExplainOutputhttp://img291.imageshack.us/img291/8129/52037513。 png



    1. mysqldbの自動インクリメントにプレフィックスを追加

    2. SQLで主キーを作成する方法

    3. 並列処理がVACUUMに登場

    4. MySQLで日時に秒を追加する