Bug #19895 | No optimization of where clause subqueries rewritable as joins | ||
---|---|---|---|
Submitted: | 17 May 2006 22:41 | Modified: | 10 Jan 2013 13:14 |
Reporter: | Michael Del Monte | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
Version: | 5.0.20, 6.0.7, 6.0.14 | OS: | Windows (Windows XP) |
Assigned to: | CPU Architecture: | Any |
[17 May 2006 22:41]
Michael Del Monte
[18 May 2006 5:22]
Valeriy Kravchuk
Thank you for a problem report. It is a well-known problem (no subqueries rewrite, bad determination if subqueries are dependent or not etc.). Work in progress. Will be fixed some day.
[20 Oct 2006 9:12]
Sveta Smirnova
There is similar bug #23370
[4 Nov 2008 18:48]
Valeriy Kravchuk
We still have this problem in 6.0.7 (to some extent): C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -P3311 -uroot -proot test Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 17 Server version: 6.0.7-alpha-community MySQL Community Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> drop table t; Query OK, 0 rows affected (0.06 sec) mysql> create table t (id int primary key, x int, key(x)) engine=MyISAM; Query OK, 0 rows affected (0.05 sec) mysql> insert into t values (1,1), (2,2), (3,3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> explain select * from t where x in (select x from t group by x)\G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: t type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 3 Extra: Using where *************************** 2. row *************************** id: 2 select_type: SUBQUERY table: t type: index possible_keys: NULL key: x key_len: 5 ref: NULL rows: 3 Extra: Using index 2 rows in set (0.05 sec) mysql> explain select * from t where x in (select x from t)\G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: t type: index possible_keys: x key: x key_len: 5 ref: NULL rows: 3 Extra: Using index; LooseScan *************************** 2. row *************************** id: 1 select_type: PRIMARY table: t type: ALL possible_keys: x key: NULL key_len: NULL ref: NULL rows: 3 Extra: Using where; Using join buffer 2 rows in set (0.01 sec) mysql> explain select * from t where exists (select x from t as t2 where t.x=t2. x)\G *************************** 1. row *************************** id: 1 select_type: PRIMARY table: t type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 3 Extra: Using where *************************** 2. row *************************** id: 2 select_type: DEPENDENT SUBQUERY table: t2 type: ref possible_keys: x key: x key_len: 5 ref: test.t.x rows: 2 Extra: Using index 2 rows in set (0.00 sec)
[10 Dec 2009 15:32]
Valeriy Kravchuk
Only last case is still NOT optimized any better with 6.0.14 from bzr: 77-52-7-73:6.0-codebase openxs$ bin/mysql -uroot test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 6.0.14-alpha-debug Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> drop table if exists t; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> create table t (id int primary key, x int, key(x)) engine=MyISAM; Query OK, 0 rows affected (0.08 sec) mysql> insert into t values (1,1), (2,2), (3,3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> explain select * from t where x in (select x from t group by x); +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ | 1 | PRIMARY | t | ALL | NULL | NULL | NULL | NULL | 3 | Using where | | 2 | SUBQUERY | t | index | NULL | x | 5 | NULL | 3 | Using index | +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 2 rows in set (0.03 sec) mysql> explain select * from t where x in (select x from t); +----+-------------+-------+-------+---------------+------+---------+----------+------+------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+------+---------+----------+------+------------------------+ | 1 | PRIMARY | t | index | x | x | 5 | NULL | 3 | Using index; LooseScan | | 1 | PRIMARY | t | ref | x | x | 5 | test.t.x | 2 | | +----+-------------+-------+-------+---------------+------+---------+----------+------+------------------------+ 2 rows in set (0.00 sec) mysql> explain select * from t where exists (select x from t as t2 where t.x=t2.x); +----+--------------------+-------+------+---------------+------+---------+----------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+-------+------+---------------+------+---------+----------+------+-------------+ | 1 | PRIMARY | t | ALL | NULL | NULL | NULL | NULL | 3 | Using where | | 2 | DEPENDENT SUBQUERY | t2 | ref | x | x | 5 | test.t.x | 2 | Using index | +----+--------------------+-------+------+---------------+------+---------+----------+------+-------------+ 2 rows in set (0.00 sec)
[10 Jan 2013 13:14]
Erlend Dahl
Implemented in 5.6.8.