面试题答案
一键面试- 利用EXPLAIN关键字分析查询语句执行计划:
在MySQL中,只需在查询语句前加上
EXPLAIN
关键字,如EXPLAIN SELECT column1, column2 FROM table_name;
。执行该语句后,MySQL会返回查询执行计划的详细信息。 - 从执行计划中重点关注的关键信息:
- id:表示查询中每个SELECT子句的标识符。id相同,执行顺序由上至下;id不同,值越大越先执行。
- select_type:常见类型有
SIMPLE
(简单查询,无子查询或union)、PRIMARY
(最外层查询)、SUBQUERY
(子查询)、DERIVED
(派生表,在from子句中的子查询)等。不同类型影响查询的复杂程度和执行方式。 - table:显示这一步操作所涉及的表。
- partitions:若表进行了分区,这里显示查询将访问的分区。
- type:表示表的连接类型,常见类型从优到差依次为
system
(表仅有一行记录,基本不会出现)、const
(通过索引一次就找到记录,常用于主键或唯一索引查询)、eq_ref
(多表连接时,对前一个表的每行记录,在后一个表中通过索引找到匹配的唯一记录,常用于主键或唯一索引连接)、ref
(通过非唯一索引匹配多个记录)、range
(只检索给定范围的行,使用一个索引来选择行,如where条件有between
、>、<
等)、index
(全索引扫描,遍历整个索引树)、ALL
(全表扫描)。一般应尽量避免ALL
类型。 - possible_keys:显示可能用于查询的索引。若为空,可能需要添加合适索引。
- key:实际使用的索引。若与
possible_keys
不一致,可能需调整查询或索引。 - key_len:表示使用索引的长度,可判断索引使用是否高效。值越短越好。
- ref:显示哪些列或常量被用于查找索引列上的值。
- rows:估计为找到所需行需读取的行数,值越小性能越好。
- filtered:表示存储引擎返回的数据在server层过滤后,剩下满足查询条件的记录数量的比例,值越高越好。