Bug #18656 | User variable in where subquery causes long delay | ||
---|---|---|---|
Submitted: | 30 Mar 2006 16:30 | Modified: | 26 Dec 2010 14:00 |
Reporter: | adkap | Email Updates: | |
Status: | Duplicate | Impact on me: | |
Category: | MySQL Server | Severity: | S5 (Performance) |
Version: | 5.0.15 | OS: | Linux (Suse 10) |
Assigned to: | CPU Architecture: | Any |
[30 Mar 2006 16:30]
adkap
[30 Mar 2006 20:45]
Valeriy Kravchuk
Thank you for a problem report. Please, try to repeat on the newer version, 5.0.19, and inform about the results. Please, send aslo the results of: SHOW CREATE TABLE ServerStats; EXPLAIN SELECT * FROM ServerStats WHERE serverId=@SERVER AND timestamp=(SELECT MAX(timestamp) FROM ServerStats WHERE serverId=@SERVER)\G EXPLAIN SELECT * FROM ServerStats WHERE serverId=@SERVER AND timestamp=(SELECT MAX(timestamp) FROM ServerStats WHERE serverId=72)\G
[30 Mar 2006 21:18]
adkap
Note: Some of the columns names that are not applicable were removed. It's not my place to publish parts of our proprietary schema. ;) mysql> SHOW CREATE TABLE ServerStats\G *************************** 1. row *************************** Table: ServerStats Create Table: CREATE TABLE `ServerStats` ( `na1` bigint(20) NOT NULL auto_increment, `na2` int(11) NOT NULL, `na3` int(11) default NULL, `timestamp` datetime default NULL, `na4` datetime default NULL, `na5` int(11) default NULL, `na6` int(11) default NULL, `na7` int(11) default NULL, `na8` int(11) default NULL, `na9` int(11) default NULL, `na10` int(11) default NULL, `na11` int(11) default NULL, `na12` int(11) default NULL, `na13` int(11) default NULL, `na14` int(11) default NULL, `na15` int(11) default NULL, `na16` int(11) default NULL, `na17` int(11) default NULL, `na18` int(11) default NULL, `na19` int(11) default NULL, `na20` int(11) default NULL, `na21` smallint(6) default '0', `serverId` bigint(20) NOT NULL, PRIMARY KEY (`na1`), KEY `FK_ServerStats_Server` (`serverId`), CONSTRAINT `FK_ServerStats_Server` FOREIGN KEY (`serverId`) REFERENCES `Server` (`serverId`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) ---------------------------------------------------------- mysql> EXPLAIN SELECT * FROM ServerStats WHERE serverId=@SERVER AND timestamp=(SELECT MAX(timestamp) FROM ServerStats WHERE serverId=@SERVER)\G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: ServerStats type: ref possible_keys: FK_ServerStats_Server key: FK_ServerStats_Server key_len: 8 ref: const rows: 896 Extra: Using where *************************** 2. row *************************** id: 2 select_type: UNCACHEABLE SUBQUERY table: ServerStats type: ref possible_keys: FK_ServerStats_Server key: FK_ServerStats_Server key_len: 8 ref: const rows: 896 Extra: 2 rows in set (0.00 sec) ---------------------------------------------------------- mysql> EXPLAIN SELECT * FROM ServerStats WHERE serverId=@SERVER AND timestamp=(SELECT MAX(timestamp) FROM ServerStats WHERE serverId=72)\G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: ServerStats type: ref possible_keys: FK_ServerStats_Server key: FK_ServerStats_Server key_len: 8 ref: const rows: 896 Extra: Using where *************************** 2. row *************************** id: 2 select_type: SUBQUERY table: ServerStats type: ref possible_keys: FK_ServerStats_Server key: FK_ServerStats_Server key_len: 8 ref: rows: 896 Extra: 2 rows in set (0.00 sec) If you do need the colum names, I can post a private comment. Also, I can't upgrade this server right now. Though, its only 0.0.04 versions behind v5.0.19. The table has grown to 900 rows now, and the slow subquery is now over 7 seconds. The fast one is still almost instant.
[27 Apr 2006 12:48]
Valeriy Kravchuk
Query plans are really different with user variable and without it. Have you seen that UNCACHEABLE SUBQUERY in a plan with user varaible? Hance the difference in time. Try to execute both queries with query cache disabled. Try to upgrade to a newer version, 5.0.20a also. That 0.0.5 really makes difference. Please, send also the SHOW TABLE STATUS results for the `ServerStats` table.
[10 May 2006 14:35]
adkap
the database is empty right now. as soon as it is back online I will provide that information.
[11 May 2006 8:56]
Valeriy Kravchuk
Please, reopen this report when you'll have the information required.
[11 Jun 2006 23:00]
Bugs System
No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open".
[16 Dec 2010 23:56]
Jesper Wisborg Krogh
I know this is an old issue but as I came across it yesterday in 5.0.77, I will add my test case. CREATE TABLE test_table ( id int unsigned NOT NULL PRIMARY KEY ) ENGINE=InnoDB; INSERT INTO test_table VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); CREATE TABLE test_table_2 LIKE test_table; INSERT INTO test_table_2 SELECT * FROM test_table; EXPLAIN SELECT * FROM test_table t1 JOIN test_table_2 t2 ON t2.id = (SELECT 1 FROM test_table t1_i WHERE t1_i.id = 1 ); +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ | 1 | PRIMARY | t2 | const | PRIMARY | PRIMARY | 4 | const | 1 | Using index | | 1 | PRIMARY | t1 | index | NULL | PRIMARY | 4 | NULL | 10 | Using index | | 2 | SUBQUERY | t1_i | const | PRIMARY | PRIMARY | 4 | | 1 | Using index | +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ 3 rows in set (0.00 sec) SET @TEST = 1; EXPLAIN SELECT * FROM test_table t1 JOIN test_table_2 t2 ON t2.id = (SELECT 1 FROM test_table t1_i WHERE t1_i.id = @TEST ); +----+----------------------+-------+-------+---------------+---------+---------+-------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+----------------------+-------+-------+---------------+---------+---------+-------+------+--------------------------+ | 1 | PRIMARY | t1 | index | NULL | PRIMARY | 4 | NULL | 10 | Using index | | 1 | PRIMARY | t2 | index | NULL | PRIMARY | 4 | NULL | 10 | Using where; Using index | | 2 | UNCACHEABLE SUBQUERY | t1_i | const | PRIMARY | PRIMARY | 4 | const | 1 | Using index | +----+----------------------+-------+-------+---------------+---------+---------+-------+------+--------------------------+ 3 rows in set (0.00 sec) So with a user variable the index look up is replaced by a table scan (or in this case an index scan). I don't know whether this is related to bug #32341?
[26 Dec 2010 14:00]
Valeriy Kravchuk
Let's say this is a duplicate of Bug #32341.