虽然INDEX存在,但MySQL EXPLAIN显示所有类型

时间:2015-01-12 08:19:25

标签: mysql select join

我使用EXPLAIN

运行以下查询
EXPLAIN SELECT form.id           AS `Reference No.`, 
               department.name   AS `Department`, 
               section.name      AS `Section` 
FROM   form 
       JOIN department 
         ON form.deptid = department.id 
       JOIN section 
         ON form.sectid = section.id 

第一行中的类型ALL是否表示会出现性能问题?

+----+-------------+------------+--------+---------------+---------+---------+----------------------+------+
| id | select_type |   table    |  type  | possible_keys |   key   | key_len |         ref          | rows |
+----+-------------+------------+--------+---------------+---------+---------+----------------------+------+
|  1 | SIMPLE      | form       | ALL    | deptid,sectid |         |         |                      |  779 |
|  1 | SIMPLE      | department | eq_ref | PRIMARY       | PRIMARY |       4 | wfs-test.form.deptid |    1 |
|  1 | SIMPLE      | section    | eq_ref | PRIMARY       | PRIMARY |       4 | wfs-test.form.sectid |    1 |
+----+-------------+------------+--------+---------------+---------+---------+----------------------+------+

1 个答案:

答案 0 :(得分:1)

当MySQL从表form获取数据时,没有理由使用索引。由于查询没有任何WHERE子句,因此表from中的所有行都可能包含在最终结果集中。更多,因为没有ORDER BY子句,所以行的任何顺序都足够好。这就是MySQL直接从表中获取行而不咨询任何索引的原因。

如果包含WHERE条件中涉及(某些)字段的索引存在(并且字段按正确顺序排列,则添加WHERE条件可能会触发使用索引是索引中包含的最左边的列。

在表ORDER BY中的字段上添加WHERE子句(不包含form)也可以在包含从表form中选择的所有字段时触发使用索引在索引中。它会将类型从ALL更改为index,这意味着它将对索引进行全面扫描而不是数据行以获取所需的数据。虽然这仍然是完整扫描,但full index scan通常比full table scan运行得更快,因为从存储加载的数据更少并且已解析(索引通常小于表数据)。

有关此内容的更多信息,请参阅MySQL documentation

整个部分"8.2.1 Optimizing SELECT Statements"值得一读,以便更好地了解如何编写更快的查询。