Chao's Blog Chao's Blog
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)

~chao

永远菜鸟,不断努力~
首页
  • vue

    • vue路由
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • java
  • spring
  • springboot
  • springcloud
  • git
  • maven
  • nginx
  • tomcat
  • springmvc
  • jvm
  • 图数据库
  • mysql数据库
  • redis数据库
  • windows下docker安装nginx并挂载目录
  • linux命令
  • linux安装软件
  • linux脚本
  • idea
  • vscode
  • 归档
  • 综合项目

    • 若依项目
    • mall项目
  • java
  • mybatis
  • xxl-job
  • mybatis
GitHub (opens new window)
  • cypher图数据

  • mysql数据库

    • mysql尚硅谷宋红康

    • 总结

    • mysql数据库备份与恢复

    • mysql日志

    • mysql性能优化

      • MySQL性能优化是什么,如何定位效率低下的SQL?
      • MySQL如何分析查询语句?
        • 索引到底对查询速度有什么影响?
        • MySQL优化数据库结构的3种方法
        • MySQL小技巧:提高插入数据的速度
        • MySQL优化服务器,提高MySQL的运行速度!
    • redis数据库

    • oracle数据库

    • 数据库
    • mysql数据库
    • mysql性能优化
    ~chao
    2023-01-29
    目录

    MySQL如何分析查询语句?

    # MySQL如何分析查询语句?

    查询是数据库中最频繁的操作,提高查询速度可以有效的提高 MySQL 数据库的性能。在《如何定位效率低下的SQL语句 (opens new window)》一节我们了解了如何查询效率低下的 SQL 语句,本节主要介绍如何分析查询语句。

    通过对查询语句的分析,可以了解查询语句的执行情况,找出查询语句执行的瓶颈,从而优化查询语句。在 MySQL 中,可以使用 EXPLAIN 和 DESCRIBE 获取 MySQL 执行 SELECT 语句的信息,来分析查询语句。

    EXPLAIN 语句的基本语法如下:

    EXPLAIN SELECT 语句;

    “SELECT 语句”参数一般为数据库查询命令,如“SELECT * FROM tb_student”。通过 EXPLAIN 关键字可以分析后面 SELECT 语句的执行情况,并且能够分析出所查询表的一些内容。

    # 例 1

    下面使用 EXPLAIN 语句来分析一个查询语句。代码执行如下:

    mysql> EXPLAIN SELECT * FROM tb_student \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tb_student partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 7 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.01 sec)

    对以上结果中参数说明如下:

    # 1)id

    表示 SELECT 语句的编号,也就是在整个查询中 SELECT 的位置。如果在语句中没子查询或关联查询,只有唯一的 SELECT,每行都将显示 1。否则,内层的 SELECT 语句一般会顺序编号,对应于其在原始语句中的位置。

    # 2)select_type

    表示 SELECT 语句的类型,该参数有以下几个常用的取值:

    • SIMPLE:表示简单查询,其中不包括连接查询和子查询;
    • PRIMARY:表示主查询,或者是最外层的查询语句;
    • UNION:表示连接查询的第二个或后面的查询语句;
    • DEPENDENT UNION:连接查询中的第 2 个或后面的 SELECT 语句,取决于外面的查询;
    • UNION RESULT:连接查询的结果;
    • SUBQUERY:子查询中的第 1 个 SELECT 语句;
    • DEPENDENT SUBQUERY:子查询中的第 1 个 SELECT 语句,取决于外面的查询;
    • DERIVED:导出表的 SELECT(FROM 子句的子查询)。

    # 4)table

    表示查询的表;

    # 5)type

    表示表的连接类型。该参数有以下几个常用的取值,范围从 NULL 到 ALL。下面按照最佳类型到最差类型排序:

    • NULL:不用访问表或者索引,直接就能得到结果;
    • system:表示表中只有一条记录;
    • const:表示表中有多条记录,但只从表中查询一条记录;
    • eq _ref:类似 ref,表示多表连接时,后面的表使用了 UNIQUE 或者 PRIMARY KEY;
    • ref:表示多表查询时,后面的表使用了普通索引;
    • range:表示查询语句中给出了查询范围,常见于 <、<=、>、>=、between 等操作符;
    • index:表示对表中的索引进行了完整的扫描,MySQL 遍历整个索引来查询匹配的行;
    • ALL:表示对表进行了完整的扫描,MySQL 遍历全表来找到匹配的行。

    # 6)possible_keys

    表示查询中可以使用的索引;

    # 7)key

    表示实际查询中使用到的索引;

    # 8)key_len

    表示索引字段的长度;

    # 9)ref

    表示使用哪个列或常数与索引一起来查询记录;

    # 10)rows

    表示查询的行数;

    # 11)filtered

    MySQL 5.7 版本之前使用 EXPLAIN EXTENDED 时会出现这个字段,MySQL 5.7 版本之后包括 5.7 版本默认就有这个字段。这个字段表示存储引擎返回的数据在 server 层过滤后,剩下多少满足查询记录数量的比例。注意是百分比,不是具体记录数。

    # 12)Extra

    表示查询过程的附件信息。

    DESCRIBE 语句的使用方法与 EXPLAIN 语句一样,DESCRIBE 语句的语法形式如下:

    DESCRIBE SELECT语句;

    DESCRIBE 可以缩写成 DESC。

    # 例 2

    下面使用 DESCRIBE 语句来分析一个查询语句。代码执行如下:

    mysql> DESCRIBE SELECT * FROM tb_student \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: tb_student partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 7 filtered: 100.00 Extra: NULL 1 row in set, 1 warning (0.00 sec)

    可以看出,以上运行结果与例 1 基本相同,这里不再对上述参数进行说明,参考例 1 即可。

    编辑 (opens new window)
    上次更新: 2024/01/26, 05:03:22
    MySQL性能优化是什么,如何定位效率低下的SQL?
    索引到底对查询速度有什么影响?

    ← MySQL性能优化是什么,如何定位效率低下的SQL? 索引到底对查询速度有什么影响?→

    最近更新
    01
    python使用生成器读取大文件-500g
    09-24
    02
    Windows环境下 Docker Desktop 安装 Nginx
    04-10
    03
    使用nginx部署多个前端项目(三种方式)
    04-10
    更多文章>
    Theme by Vdoing | Copyright © 2022-2024 chaos | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式