This SELECT query takes 180 seconds to finish

后端 未结 3 1637
[愿得一人]
[愿得一人] 2020-12-06 02:08

UPDATE:

Just to mention it on a more visible place. When I changed IN for =, the query execution time went from 180 down to 0.00008 seconds. Ridiculous speed differe

3条回答
  •  天涯浪人
    2020-12-06 02:31

    (Posting my comment as an answer as apparently it did make a difference!)

    Any difference if you change the IN to =?

    If anyone wants to investigate this further I've just done a test and found it very easy to reproduce.

    Create Table

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

    Create Procedure

    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
    

    Populate Table

      call prc_filler(5000)
    

    Query 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 Explain Output http://img689.imageshack.us/img689/5592/equals.png

    Query 2 (same problem)

    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
        )
      )
    

    In Explain Output http://img291.imageshack.us/img291/8129/52037513.png

提交回复
热议问题