技术博客 技术博客
  • JAVA
  • 仓颉
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
  • AI
GitHub (opens new window)
  • JAVA
  • 仓颉
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
  • AI
GitHub (opens new window)
  • mysql

    • MySQL 问题汇总
    • MySQL 索引介绍
    • MySQL 锁介绍
    • MySQL 索引优化工具 explain
      • Explain 用法
      • id
      • select_type
      • table
      • type
      • possible_keys
      • Key
      • key_len
      • ref
      • rows
      • extra
        • using fileSort(重点优化)
        • using temporary(重点优化)
        • USING index(重点)
        • Using wher
        • using join buffer
        • impossible where
        • select tables optimized away
        • distinct
    • MySQL 主从复制(GTID)
    • MySQL 8安装
    • MySQL 8.x新特性总结
    • MySQL UDF以及新类型JSON
    • MySQL 高可用MGR(一) 理论
    • MySQL 高可用MGR(二) 搭建
    • MySQL 高可用MGR(三) 测试
  • Elasticsearch

    • ES 7.8.0(一) 入门介绍
    • ES 7.8.0(二) 读、写和写索引流程以及文档分析过程
    • ES 7.8.0(三) 文档冲突
  • mongodb

    • mongodb
  • hadoop

    • Hadoop 伪分布式及集群
    • Hadoop 指令
    • Hadoop 读写流程详解
    • Hadoop SpringBoot集成
    • Hadoop MapReduce机制
    • Hadoop YARN
    • Hadoop MapReduce配置和编写job及数据倾斜的解决
    • Hadoop MapReduce自定义格式输入输出
  • clickhouse

    • ClickHouse 介绍及安装
    • ClickHouse 数据类型
    • ClickHouse 表引擎
    • ClickHouse SQL操作
    • ClickHouse 副本配置
    • ClickHouse 分片与集群部署
    • ClickHouse Explain及建表优化
    • ClickHouse 语法优化规则
    • ClickHouse 查询优化
    • ClickHouse 数据一致性
    • ClickHouse 物化视图
    • ClickHouse MaterializeMySQL引擎
    • ClickHouse 监控及备份
  • hbase

    • Hbase 介绍及安装
    • Hbase 优化
    • Hbase phoenix安装及使用
    • Hbase LSM-TREE
  • hive

    • Hive 介绍及安装
    • Hive 内外部表、分区表、分桶表概念及hiveSQL命令
    • Hive 数据类型
    • Hive 函数 MySQL联合
    • Hive 数据倾斜和优化
    • Hive Sqoop安装及指令
  • flink

    • Flink 介绍及安装
    • Flink 配置介绍及Demo
    • Flink API讲解
    • Flink 运行架构
    • Flink 时间语义及Watermark
    • Flink 状态管理
    • Flink 容错,检查点,保存点
    • Flink 状态一致性
    • Flink Table API 和 Flink SQL
    • Flink CEP编程
    • Flink Joining编程
    • Flink CDC
  • flume

    • Flume 日志收集系统介绍及安装
    • Flume Source支持的类型
    • Flume Sink支持的类型
    • Flume Channel支持的类型
    • Flume Selector
    • Flume Interceptor拦截器类型
    • Flume Process
  • sqlite

    • SQLite介绍
目录

MySQL 索引优化工具 explain

# Explain 用法

模拟 Mysql 优化器是如何执行 SQL 查询语句的,从而知道 Mysql 是如何处理你的 SQL 语句的。分析你的查询语句或是表结构的性能瓶颈。
语法:Explain + SQL 语句;
如:Explain select * from user; 会生成如下 SQL 分析结果,下面详细对每个字段进行详解

# id

是一组数字,代表多个表之间的查询顺序,或者包含子句查询语句中的顺序,id 总共分为三种情况,依次详解

id 相同,执行顺序由上至下
id 不同,如果是子查询,id 号会递增,id 值越大优先级越高,越先被执行
id 相同和不同的情况同时存在

# select_type

select_type 包含以下几种值:

  • simple
    简单的 select 查询,查询中不包含子查询或者 union 查询

  • primary
    如果 SQL 语句中包含任何子查询,那么子查询的最外层会被标记为 primary

  • subquery
    在 select 或者 where 里包含了子查询,那么子查询就会被标记为 subQquery,同三。二同时出现

  • derived
    在 from 中包含的子查询,会被标记为衍生查询,会把查询结果放到一个临时表中

  • union / union result
    如果有两个 select 查询语句,他们之间用 union 连起来查询,那么第二个 select 会被标记为 union,union 的结果被标记为 union result。它的 id 是为 null 的

# table

表示这一行的数据是哪张表的数据

# type

type 是代表 MySQL 使用了哪种索引类型,不同的索引类型的查询效率也是不一样的,常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从上到下,性能从差到好)

  • ALL
    Full Table Scan, MySQL 将遍历全表以找到匹配的行
  • index
    Full Index Scan,index 与 ALL 区别为 index 类型只遍历索引树
  • range
    只检索给定范围的行,使用一个索引来选择行
  • ref
    表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
  • eq_ref
    类似 ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用 primary key 或者 unique key 作为关联条件
  • const、system
    当 MySQL 对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于 where 列表中,MySQL 就能将该查询转换为一个常量,system 是 const 类型的特例,当查询的表只有一行的情况下,使用 system
  • NULL
    MySQL 在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

# possible_keys

此次查询中涉及字段上若存在索引,则会被列出来,表示可能会用到的索引,但并不是实际上一定会用到的索引

# Key

key 列显示 MySQL 实际决定使用的键(索引),必然包含在 possible_keys 中
如果没有选择索引,键是 NULL。要想强制 MySQL 使用或忽视 possible_keys 列中的索引,在查询中使用 FORCE INDEX、USE INDEX 或者 IGNORE INDEX。

# key_len

表示索引中使用的字节数,通过该属性可以知道在查询中使用的索引长度,注意:这个长度是最大可能长度,并非实际使用长度,在不损失精确性的情况下,长度越短查询效率越高

# ref

显示关联的字段。如果使用常数等值查询,则显示 const,如果是连接查询,则会显示关联的字段。

  • tb_emp 表为非唯一性索引扫描,实际使用的索引列为 idx_name,由于 tb_emp.name='rose' 为一个常量,所以 ref=const。
  • tb_dept 为唯一索引扫描,从 sql 语句可以看出,实际使用了 PRIMARY 主键索引,ref=db01.tb_emp.deptid 表示关联了 db01 数据库中 tb_emp 表的 deptid 字段。

# rows

根据表信息统计以及索引的使用情况,大致估算说要找到所需记录需要读取的行数,rows 越小越好

# extra

不适合在其他列显示出来,但在优化时十分重要的信息

# using fileSort(重点优化)

俗称 "文件排序" ,在数据量大的时候几乎是 “九死一生”,在 order by 或者在 group by 排序的过程中,order by 的字段不是索引字段,或者 select 查询字段存在不是索引字段,或者 select 查询字段都是索引字段,但是 order by 字段和 select 索引字段的顺序不一致,都会导致 fileSort

# using temporary(重点优化)

使用了临时表保存中间结果,常见于 order by 和 group by 中。

# USING index(重点)

表示相应的 select 操作中使用了覆盖索引(Coveing Index), 避免访问了表的数据行,效率不错! 如果同时出现 using where,表明索引被用来执行索引键值的查找;如果没有同时出现 using where,表面索引用来读取数据而非执行查找动作。

# Using wher

表明使用了 where 过滤

# using join buffer

使用了连接缓存

# impossible where

where 子句的值总是 false,不能用来获取任何元组

# select tables optimized away

在没有 GROUPBY 子句的情况下,基于索引优化 MIN/MAX 操作或者 对于 MyISAM 存储引擎优化 COUNT (*) 操作,不必等到执行阶段再进行计算, 查询执行计划生成的阶段即完成优化。

# distinct

优化 distinct,在找到第一匹配的元组后即停止找同样值的工作

上次更新: 6/11/2025, 4:10:30 PM
MySQL 锁介绍
MySQL 主从复制(GTID)

← MySQL 锁介绍 MySQL 主从复制(GTID)→

Theme by Vdoing | Copyright © 2023-2025
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式