MySQL 面试题, 用过 explain 吗?说说怎么分析的?
MySQL 面试题, 用过 explain 吗?说说怎么分析的?
QA
Step 1
Q:: 你用过 MySQL 的 EXPLAIN 吗?请解释一下它的作用和用法。
A:: 是的,EXPLAIN 是 MySQL 中用于显示 SQL 查询的执行计划的命令。它提供了查询优化器如何执行查询的详细信息。使用 EXPLAIN 可以帮助我们了解查询的执行过程,识别性能瓶颈,并优化查询。通常会在 SELECT、DELETE、INSERT 和 UPDATE 查询前使用 EXPLAIN。
Step 2
Q:: 在使用 EXPLAIN 时,输出的字段有哪些?请分别解释它们的含义。
A:: 使用 EXPLAIN 时,输出的字段包括:
1.
id:查询执行的序列号,表示执行顺序。
2.
select_type:查询的类型,比如简单查询、联合查询等。
3.
table:表名。
4.
type:访问类型(ALL、index、range、ref、eq_ref、const、system、NULL),表示查询使用的索引类型。
5.
possible_keys:可能使用的索引。
6.
key:实际使用的索引。
7.
key_len:使用的索引长度。
8.
ref:显示索引的哪一列被使用了。
9.
rows:扫描的行数。
10.
Extra:额外信息,如 Using index、Using where 等。
Step 3
Q:: 如何利用 EXPLAIN 输出优化查询?
A:: 通过分析 EXPLAIN 输出,可以识别性能瓶颈,比如全表扫描(type 列显示为 ALL),建议加索引或优化查询条件。查看 rows 列的值,如果扫描的行数过多,可以考虑使用更有效的索引或重构查询。检查 Extra 列的信息,如果显示 Using temporary 或 Using filesort,表示查询有临时表或排序操作,可能需要优化。
Step 4
Q:: EXPLAIN 的输出中,type 列表示什么?各个类型的访问方式的性能如何?
A:: type 列表示查询使用的访问类型,包括:
1.
ALL:全表扫描,性能最差。
2.
index:全索引扫描,比全表扫描稍好。
3.
range:索引范围扫描,性能较好。
4.
ref:非唯一索引扫描,性能较好。
5.
eq_ref:唯一索引扫描,性能很好。
6.
const:常量扫描,只匹配一行,性能最佳。
7.
system:系统表扫描,只有一行记录,性能最佳。
8.
NULL:不需要访问表,性能最佳。