56,677
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE t1(id int, PRIMARY KEY (id)) engine=innodb;
INSERT INTO t1(id) VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
CREATE TABLE t2(rid int, id int, PRIMARY KEY (rid, id)) engine=innodb;
INSERT INTO t2(rid, id) VALUES(547, 1),(547, 2),(547, 5),(547, 8),(203, 2),(203, 4),(203, 8);
mysql> SELECT VERSION();
+------------+
| VERSION() |
+------------+
| 5.5.30-log |
+------------+
1 row in set (0.01 sec)
mysql> explain SELECT * FROM t1 INNER JOIN t2 WHERE rid = 203 AND t2.id > 2 AND t2.id IN (SELECT t1.id FROM t1 INNER JOIN t2 USING(id) WHERE rid = 547);
+----+--------------------+-------+--------+---------------+---------+---------+------------+------+--------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+--------+---------------+---------+---------+------------+------+--------------------------------+
| 1 | PRIMARY | t2 | range | PRIMARY | PRIMARY | 8 | NULL | 2 | Using where; Using index |
| 1 | PRIMARY | t1 | index | NULL | PRIMARY | 4 | NULL | 10 | Using index; Using join buffer |
| 2 | DEPENDENT SUBQUERY | t2 | eq_ref | PRIMARY | PRIMARY | 8 | const,func | 1 | Using index |
| 2 | DEPENDENT SUBQUERY | t1 | eq_ref | PRIMARY | PRIMARY | 4 | func | 1 | Using where; Using index |
+----+--------------------+-------+--------+---------------+---------+---------+------------+------+--------------------------------+
4 rows in set (0.01 sec)
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.6.10 |
+-----------+
1 row in set (0.00 sec)
mysql> explain SELECT * FROM t1 INNER JOIN t2 WHERE rid = 203 AND t2.id > 2 AND t2.id IN (SELECT t1.id FROM t1 INNER JOIN t2 USING(id) WHERE rid = 547);
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+----------------------------------------------------+
| 1 | SIMPLE | t2 | ref | PRIMARY | PRIMARY | 4 | const | 1 | Using where; Using index |
| 1 | SIMPLE | t2 | eq_ref | PRIMARY | PRIMARY | 8 | const,test.t2.id | 1 | Using index |
| 1 | SIMPLE | t1 | eq_ref | PRIMARY | PRIMARY | 4 | test.t2.id | 1 | Using index |
| 1 | SIMPLE | t1 | index | NULL | PRIMARY | 4 | NULL | 10 | Using index; Using join buffer (Block Nested Loop) |
+----+-------------+-------+--------+---------------+---------+---------+------------------+------+----------------------------------------------------+
4 rows in set (0.00 sec)
mysql> EXPLAIN SELECT t1.id FROM `t1` INNER JOIN `t2` USING(id) WHERE `t2`.`rid` =11825 AND `t1`.`id` IN (SELECT `t1`.`id` FROM `t1` INNER JOIN `t2` USING(id) WHERE `t2`.`rid` =413157);
+----+-------------+-----------------+--------+---------------+---------+---------+----------------------------------------+------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+--------+---------------+---------+---------+----------------------------------------+------+------------------------------+
| 1 | SIMPLE | t2 | ref | rid | rid | 3 | const | 6501 | Using index |
| 1 | SIMPLE | t2 | ref | rid | rid | 7 | const,test.t2.id | 1 | Using index; Start temporary |
| 1 | SIMPLE | t1 | eq_ref | PRIMARY | PRIMARY | 4 | test.t2.id | 1 | Using index |
| 1 | SIMPLE | t1 | eq_ref | PRIMARY | PRIMARY | 4 | test.t2.id | 1 | Using index; End temporary |
+----+-------------+-----------------+--------+---------------+---------+---------+----------------------------------------+------+------------------------------+
SELECT * FROM t1 INNER JOIN t2 WHERE rid = 203 AND t2.id > 2 AND t2.id IN (SELECT t1.id FROM t1 INNER JOIN t2 USING(id) WHERE rid = 547);