| Bug #13263 | EXISTS subquery optimization depends on columns SELECTed | ||
|---|---|---|---|
| Submitted: | 16 Sep 2005 12:45 | Modified: | 19 Mar 2008 11:41 |
| Reporter: | Matthias Pigulla | Email Updates: | |
| Status: | Can't repeat | Impact on me: | |
| Category: | MySQL Server | Severity: | S3 (Non-critical) |
| Version: | 5.0.45 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[16 Sep 2005 12:45]
Matthias Pigulla
[16 Sep 2005 13:14]
Valeriy Kravchuk
Plans are the same on newer 4.1.14 version (for InnoDB tables at least):
mysql> SELECT t1.id, t1.name,
-> IF (EXISTS (SELECT id FROM file WHERE document_id = t1.id), 'file_exists', 'no file') as existance
-> FROM document AS t1;
+----+--------+-------------+
| id | name | existance |
+----+--------+-------------+
| 1 | test | file_exists |
| 2 | test 2 | file_exists |
| 3 | test 3 | no file |
+----+--------+-------------+
3 rows in set (0.00 sec)
mysql> explain SELECT t1.id, t1.name,
-> IF (EXISTS (SELECT id FROM file WHERE document_id = t1.id), 'file_exists', 'no file') as existance
-> FROM document AS t1;
+----+--------------------+-------+------+---------------+-------------+--------
-+------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len
| ref | rows | Extra |
+----+--------------------+-------+------+---------------+-------------+--------
-+------------+------+-------------+
| 1 | PRIMARY | t1 | ALL | NULL | NULL | NULL
| NULL | 3 | |
| 2 | DEPENDENT SUBQUERY | file | ref | document_id | document_id | 2
| test.t1.id | 1 | Using index |
+----+--------------------+-------+------+---------------+-------------+--------
-+------------+------+-------------+
2 rows in set (0.03 sec)
mysql> explain SELECT t1.id, t1.name,
-> IF (EXISTS (SELECT 1 FROM file WHERE document_id = t1.id), 'file_exists
', 'no file') as existance
-> FROM document AS t1;
+----+--------------------+-------+------+---------------+-------------+--------
-+------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len
| ref | rows | Extra |
+----+--------------------+-------+------+---------------+-------------+--------
-+------------+------+-------------+
| 1 | PRIMARY | t1 | ALL | NULL | NULL | NULL
| NULL | 3 | |
| 2 | DEPENDENT SUBQUERY | file | ref | document_id | document_id | 2
| test.t1.id | 1 | Using index |
+----+--------------------+-------+------+---------------+-------------+--------
-+------------+------+-------------+
2 rows in set (0.00 sec)
mysql> select version();
+-----------+
| version() |
+-----------+
| 4.1.14-nt |
+-----------+
1 row in set (0.00 sec)
Please, try the newer version - 4.1.11 is a bit dated...
[7 Apr 2006 11:33]
Matthias Pigulla
First off - don't know if severity should be set to 5 because that option is not explained in the list of severity levels. Just checked the issue again and I was able to reproduce it on 5.0.18-nt.
[7 Apr 2006 11:37]
Matthias Pigulla
Here's the test:
mysql> CREATE TABLE document (
-> id smallint(5) unsigned NOT NULL auto_increment,
-> name varchar(250) NOT NULL default '',
-> PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql>
mysql> CREATE TABLE file (
-> id smallint(5) unsigned NOT NULL auto_increment,
-> document_id smallint(5) unsigned NOT NULL default '0',
-> file longblob,
-> PRIMARY KEY (id),
-> KEY document_id (document_id)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql>
mysql> INSERT INTO document VALUES(1, 'test');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO document VALUES(2, 'test 2');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO document VALUES(3, 'test 3');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO file VALUES(1, 1, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO file VALUES(2, 1, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO file VALUES(3, 2, NULL);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> EXPLAIN
-> SELECT t1.id, t1.name,
-> IF (
-> EXISTS (
-> SELECT id
-> FROM file WHERE document_id = t1.id
-> ),
-> "file_exists", "no file"
-> )
-> FROM document AS t1 \G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: t1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 3
Extra:
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: file
type: ref
possible_keys: document_id
key: document_id
key_len: 2
ref: bug.t1.id
rows: 2
Extra:
2 rows in set (0.00 sec)
mysql>
mysql> EXPLAIN
-> SELECT t1.id, t1.name,
-> IF (
-> EXISTS (
-> SELECT 1
-> FROM file WHERE document_id = t1.id
-> ),
-> "file_exists", "no file"
-> )
-> FROM document AS t1 \G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: t1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 3
Extra:
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: file
type: ref
possible_keys: document_id
key: document_id
key_len: 2
ref: bug.t1.id
rows: 2
Extra: Using index
2 rows in set (0.00 sec)
mysql>
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.0.18-nt |
+-----------+
1 row in set (0.00 sec)
mysql>
[19 Mar 2008 11:41]
Matthias Pigulla
Just checked and the bug still exists at least with 5.0.45 on Mac OS. Please try to reproduce with MyISAM tables.
