非常简单的自我加入,但是忽略了吗?

时间:2011-01-24 07:16:21

标签: mysql indexing self-join

得到了一个noob问题。假设我创建了下表:

的temp1

up,varchar(15)

dn,varchar(15)

我添加了几个空格:

create table temp1 (up varchar(15), dn varchar(15), index id1(up), index id2(dn))

在我用一些随机数据填充表后,我做了以下解释选择

explain select * from temp1 as t1, temp1 as t2 where t1.up = t2.up

并获取

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | t1    | ALL  | id1           | NULL | NULL    | NULL |    4 |             |
|  1 | SIMPLE      | t2    | ALL  | id1           | NULL | NULL    | NULL |    3 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+

为什么优化器不使用密钥?!我必须错过一些非常简单的事情。 。

(我问这个问题,因为我实际使用的表(700K行)的类似查询运行速度非常慢,我猜它与indeces有关。)

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

由于您从temp t1中选择了所有行(并且几乎所有来自t2) - mysql决定使用fullscan,因为它更适合这种情况。

答案 1 :(得分:0)

如果我错了,请纠正我,但这会返回你的表temp1的所有值。它不会帮助你使用任何索引,因为你不是在寻找任何东西的子集。