得到了一个noob问题。假设我创建了下表:
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有关。)
感谢您的帮助!
答案 0 :(得分:1)
由于您从temp t1中选择了所有行(并且几乎所有来自t2) - mysql决定使用fullscan,因为它更适合这种情况。
答案 1 :(得分:0)
如果我错了,请纠正我,但这会返回你的表temp1的所有值。它不会帮助你使用任何索引,因为你不是在寻找任何东西的子集。