【问题标题】:MySQL EXPLAIN showing ALL type although INDEX exists尽管存在 INDEX,但 MySQL EXPLAIN 显示 ALL 类型
【发布时间】:2015-01-12 08:19:25
【问题描述】:

我使用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 |
+----+-------------+------------+--------+---------------+---------+---------+----------------------+------+

【问题讨论】:

标签: mysql select join


【解决方案1】:

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

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

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

更多信息请访问MySQL documentation。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2020-12-11
    • 2016-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多