Bug #68748 | Selects with large "IN" conditions are very slow | ||
---|---|---|---|
Submitted: | 22 Mar 2013 16:26 | Modified: | 1 Apr 2013 16:14 |
Reporter: | Thomas Lane | Email Updates: | |
Status: | Duplicate | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S5 (Performance) |
Version: | 5.6.10 | OS: | Linux (Centos 5) |
Assigned to: | CPU Architecture: | Any |
[22 Mar 2013 16:26]
Thomas Lane
[22 Mar 2013 16:28]
Thomas Lane
Queries to illustrate performance problem
Attachment: test2.sql (text/x-sql), 610.86 KiB.
[25 Mar 2013 15:36]
Thomas Lane
Here are some stored queries to illustrate the problem (so you don't have to copy/paste huge queries): DROP TABLE IF EXISTS _Test_; CREATE TABLE _Test_ (id INT NOT NULL PRIMARY KEY) ENGINE=MYISAM; DROP PROCEDURE IF EXISTS _Populate_Test_; DELIMITER $$ CREATE PROCEDURE _Populate_Test_(c INT) BEGIN SET @values = '(1)'; SET @c = 2; WHILE @c <= c DO SET @values = CONCAT(@values,',(',@c,')'); SET @c = @c + 1; END WHILE; SET @q = CONCAT('INSERT INTO _Test_ (id) VALUES ',@values); PREPARE stmt FROM @q; EXECUTE stmt; END $$ DELIMITER ; DROP PROCEDURE IF EXISTS _Run_Test_; DELIMITER $$ CREATE PROCEDURE _Run_Test_(c INT) BEGIN SET @values = '1'; SET @c = 2; WHILE @c <= c DO SET @values = CONCAT(@values,',',@c); SET @c = @c + 1; END WHILE; SET @q = CONCAT('SELECT COUNT(*) FROM _Test_ WHERE id IN (',@values,')'); PREPARE stmt FROM @q; EXECUTE stmt; END $$ DELIMITER ; CALL _Populate_Test_(30000); CALL _Run_Test_(1000); CALL _Run_Test_(2000); CALL _Run_Test_(3000); CALL _Run_Test_(4000); CALL _Run_Test_(5000); CALL _Run_Test_(10000); CALL _Run_Test_(20000); CALL _Run_Test_(30000);
[1 Apr 2013 16:14]
MySQL Verification Team
Thank you for the testcase. This bug is a duplicate of http://bugs.mysql.com/bug.php?id=68046
[1 Apr 2013 16:17]
MySQL Verification Team
comparison to show it's fixed: Latest code (5.6.12): ---------------------- mysql> CALL _Run_Test_(50000); +----------+ | COUNT(*) | +----------+ | 30000 | +----------+ 1 row in set (2.18 sec) Query OK, 0 rows affected (2.18 sec) ------------------- 5.6.10: ------ mysql> CALL _Run_Test_(50000); +----------+ | COUNT(*) | +----------+ | 30000 | +----------+ 1 row in set (37.72 sec) Query OK, 0 rows affected (37.72 sec)