0

有一个菜鸟问题。假设我创建了下表:

温度1

向上,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 行)的类似查询运行速度非常慢,我猜它与索引有关)。

谢谢您的帮助!

4

2 回答 2

1

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

于 2011-01-24T07:18:20.240 回答
0

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

于 2011-01-24T07:31:46.917 回答