• explain用法
explain SELECT * FROM  halo.extensions WHERE name = '/registry/menus/primary';
• 输出结果含义

image.png
id:表示查询语句中的每个步骤的唯一标识符。
select_type:表示查询的类型,常见的类型包括SIMPLE、PRIMARY、UNION、SUBQUERY等。
table:表示该步骤所涉及的表。
partitions:表示该步骤所涉及的分区。
type:表示访问表的方式,常见的类型包括ALL、index、range、ref、eq_ref、const等。
possible_keys:表示可能被使用的索引。
key:表示实际被使用的索引。
key_len:表示索引的长度。
ref:表示连接条件使用的索引。
rows:表示在该步骤中需要扫描的行数目。
filtered:表示在该步骤中过滤掉的行数比例。
Extra:表示额外的信息,例如是否使用临时表、是否使用了文件排序等。


• 索引优化技巧
○ 索引是否合适:观察possible_keys与key是否相同,不一样的话,可能需要优化索引。
○ 减少全表扫描:type类型从快到慢:system > const > eq_ref > ref > range > index > ALL
○ 减少文件排序:Extra字段中显示Using filesort,表示查询语句需要进行文件排序,这会消耗大量的计算资源。可以通过添加合适的索引或使用覆盖索引来避免文件排序。
○ 减少临时表的使用:如果Extra字段中显示Using temporary,表示查询语句需要使用临时表来辅助计算,这会增加额外的开销。可以通过优化查询语句的逻辑或添加合适的索引来减少临时表的使用。
○ 优化连接操作:如果type字段为index、range、ref、eq_ref等,表示查询语句需要进行连接操作。可以通过添加合适的索引或优化连接条件来提高性能。
○ 其他参数:除了基本的语法和输出结果,EXPLAIN还支持一些其他参数,用于进一步优化查询语句的性能。例如:
format:用于指定输出格式,支持的格式包括traditional和json。默认值为traditional。
extended:用于显示更详细的输出信息,包括扫描的行数、使用的索引类型等。默认值为OFF。
analyze:用于在执行EXPLAIN之前自动执行ANALYZE TABLE语句。默认值为OFF。
partitions:用于指定是否显示关于分区表的信息。默认值为OFF。


• 详细解读
○ type:
system:表中只有一行记录(系统表)。是const类型的一个特殊情况。
const:表中最多只有一行匹配的记录。一般用在主键索引或者唯一键索引上的等值查询(如果是多字段索引,则需要全匹配)。
eq_ref:跨表join时,对于驱动表的每一行记录,被动表最多只会读取一行记录。跟单表查询不一样(system,const最快),在跨表查询中,eq_ref是最好的。
ref:等值查询,但是可能匹配大于1行记录。比如普通的非唯一索引,或者联合主键和联合唯一索引的左前缀匹配(非全匹配)。
ref_or_null:与ref类似,但是条件中多了一个IS NULL判断。
range:范围查询,一般用在BETWEEN, LIKE, >, <等。
index:扫描整个索引,效率很低,仅仅因为辅助索引的空间比主键索引小,所以比ALL效率高一点。最常用的有SELECT COUNT(*)。
ALL:全表扫描,这种情况就需要优化了。


○ select_type:
simple:简单表,不使用union或者子查询,单表的select_type,不使用union和子查询。
primary:主查询,外层的查询。
subquery:select、where之后包含了子查询,在select语句中出现的子查询语句,结果不依赖于外部查询(不在from语句中)。
dependent subquery:指在select语句中出现的查询语句,结果依赖于外部查询。
derived: 派生表。
union:union result:union关键字会将数据结果进行去重,会使用一个临时表,临时表的记录会被标记为union result。
union all: