1

我正在创建一个表格

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  |
+----+-------------+-------+-------+-------------------------------------+---------+---------+-------+------+-------+

我也尝试了 (unique,composite primary,composite) 键,但它不起作用。谁能解释为什么会这样?

4

1 回答 1

1

因为您的表包含非常少量的记录,所以优化器认为不值得使用索引。表扫描也一样好。

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

在以下情况下,查询更有可能使用索引:

  • 您只选择了该date_id字段
  • 有超过 4 行temp_test
于 2013-08-29T13:04:38.027 回答