我使用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 |
+----+-------------+------------+--------+---------------+---------+---------+----------------------+------+
答案 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"值得一读,以便更好地了解如何编写更快的查询。