gpt4 book ai didi

MySQL EXPLAIN 显示 ALL 类型,尽管 INDEX 存在

转载 作者:行者123 更新时间:2023-11-29 12:28:53 25 4
gpt4 key购买 nike

我使用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从表form获取数据时没有理由使用索引。由于查询没有任何 WHERE 子句,因此表 from 中的所有行可能都将包含在最终结果集中。此外,因为没有 ORDER BY 子句,所以行的任何顺序都足够了。这就是为什么 MySQL 直接从表中获取行,而不咨询任何索引。

如果存在包含 WHERE 条件中涉及的(部分)字段的索引(并且这些字段,按正确的顺序放置,是索引中包含的最左边的列)。

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

有关此内容的更多信息可以在 MySQL documentation 中找到。 .

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

关于MySQL EXPLAIN 显示 ALL 类型,尽管 INDEX 存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27897763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com