为什么内部连接条件不使用密钥

时间:2013-08-29 12:58:27

标签: mysql

我正在创建一个表

create table temp_test2 (
date_id int(11) NOT NULL DEFAULT '0',
 `date` date NOT NULL,
  `day` int(11) NOT NULL,
PRIMARY KEY (date_id)
);

create table temp_test1 (
date_id int(11) NOT NULL DEFAULT '0',
 `date` date NOT NULL,
  `day` int(11) NOT NULL,
PRIMARY KEY (date_id)
);


explain select * from temp_test as t  inner join temp_test2 as t2 on (t2.date_id =t.date_id) limit 3;

+----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                              |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+
|  1 | SIMPLE      | t     | ALL  | date_id       | NULL | NULL    | NULL |    4 | NULL                                               |
|  1 | SIMPLE      | t2    | ALL  | date_id       | NULL | NULL    | NULL |    4 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+

为什么表中没有使用code_id键,但是当我使用code_id=something时,它正在使用键,

explain select * from temp_test as t  inner join temp_test2 as t2 on (t2.date_id =t.date_id and t.date_id =1) limit 3;

+----+-------------+-------+-------+-------------------------------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys                       | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+-------------------------------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | t     | const | PRIMARY,date_id,date_id_2,date_id_3 | PRIMARY | 4       | const |    1 | NULL  |
|  1 | SIMPLE      | t2    | ref   | date_id,date_id_2,date_id_3         | date_id | 4       | const |    1 | NULL  |
+----+-------------+-------+-------+-------------------------------------+---------+---------+-------+------+-------+

我尝试过(唯一的,复合的主要,复合)键,但它不起作用。 谁能解释为什么这样呢?

1 个答案:

答案 0 :(得分:1)

由于您的表包含非常少量的记录,因此优化器会确定使用索引不值得。表扫描也一样好。

此外,您选择了所有字段(SELECT *),如果它使用索引执行JOIN,则仍需要进行行扫描以获取完整内容。

如果符合以下条件,查询将更有可能使用索引:

  • 您只选择了date_id字段
  • temp_test
  • 中有超过4行