面试题答案
一键面试- 使用
EXPLAIN
分析查询语句: 在支持SQL的数据库(如MySQL)中,在查询语句前加上EXPLAIN
关键字即可分析该查询,例如在MySQL中执行:
EXPLAIN SELECT table1.name, table2.age FROM table1 JOIN table2 ON table1.id = table2.id;
EXPLAIN
输出结果中主要字段含义:- id:
- 含义:
id
是查询中每个SELECT
语句的标识符。如果是单一的SELECT
查询,id
通常为1。当查询中包含子查询或联合查询时,会出现多个不同的id
值,用于标识不同层次的SELECT
操作。数值越大,执行优先级越高。
- 含义:
- select_type:
- 含义:表示
SELECT
语句的类型。常见的值有:SIMPLE
:简单SELECT
,不包含子查询或联合查询。上述查询的select_type
通常为SIMPLE
。PRIMARY
:如果查询包含子查询,最外层的SELECT
被标记为PRIMARY
。SUBQUERY
:子查询中的第一个SELECT
。DERIVED
:在FROM
子句中使用的子查询,也称为派生表。
- 含义:表示
- table:
- 含义:表示输出结果集来自哪个表。在上述查询中,会分别显示
table1
和table2
,表示数据来源于这两个表。
- 含义:表示输出结果集来自哪个表。在上述查询中,会分别显示
- partitions:
- 含义:显示查询将访问的分区。如果表未分区,该字段为空。对于分区表,它会告知具体访问哪些分区。
- type:
- 含义:表示表的连接类型,常见类型有:
ALL
:全表扫描,即对整个表进行逐行扫描。这是性能最差的连接类型。index
:索引全扫描,按索引顺序对整个索引进行扫描。虽然也是全扫描,但由于索引有序,性能通常比ALL
好。range
:范围扫描,只扫描给定范围的行,通常出现在有BETWEEN
、>
、<
等范围条件的查询中。ref
:使用非唯一索引进行连接,通过索引查找与某个值匹配的所有行。在上述查询中,如果table1.id
和table2.id
字段上有索引,可能会出现ref
类型。eq_ref
:通常出现在JOIN
语句中,使用唯一索引或主键进行连接,每个索引键值只匹配一条记录。例如在ON
条件中使用主键连接时可能出现。const
、system
:const
用于通过索引一次就找到记录,表最多有一条匹配行,常出现在使用主键或唯一索引常量查询时;system
是const
的特例,表只有一行记录。
- 含义:表示表的连接类型,常见类型有:
- possible_keys:
- 含义:显示查询可能使用到的索引。这些索引是基于查询条件和表结构推测出来的。在上述查询中,如果
table1.id
和table2.id
字段上有索引,这些索引会显示在possible_keys
中。
- 含义:显示查询可能使用到的索引。这些索引是基于查询条件和表结构推测出来的。在上述查询中,如果
- key:
- 含义:表示实际使用的索引。如果为
NULL
,则表示没有使用索引。理想情况下,key
应该与possible_keys
中的某个索引一致,以提高查询性能。
- 含义:表示实际使用的索引。如果为
- key_len:
- 含义:表示实际使用的索引长度。通过该值可以判断是否完全使用了索引。较短的
key_len
值通常意味着更高效的索引使用。
- 含义:表示实际使用的索引长度。通过该值可以判断是否完全使用了索引。较短的
- ref:
- 含义:显示哪些列或常量被用于与索引进行比较。例如,如果是
const
值与索引比较,会显示const
;如果是其他表的列与索引比较,会显示相应的表和列名。
- 含义:显示哪些列或常量被用于与索引进行比较。例如,如果是
- rows:
- 含义:估计为了找到所需的行需要读取的行数。该值是一个预估值,用于评估查询的成本。行数越少,通常查询性能越好。
- filtered:
- 含义:表示存储引擎返回的数据在经过过滤条件后,满足条件的数据所占的百分比。100表示所有返回的数据都满足过滤条件。
- id:
通过分析EXPLAIN
的输出结果,可以优化查询语句,例如添加合适的索引来提高查询性能。