关于MySQL中的查询开销查看方法详解

 更新时间:2018年07月06日 10:55:59   作者:学习日志  
一个查询通常可以有很多种执行方式,并且返回同样的结果,而好的程序员应该是找到最好的方式,下面这篇文章主要给大家介绍了关于MySQL中查询开销查看方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

MySQL逻辑架构

如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器。下图展示了MySQL的逻辑架构图。

MySQL逻辑架构,来自:高性能MySQL

MySQL逻辑架构整体分为三层,最上层为客户端层,并非MySQL所独有,诸如:连接处理、授权认证、安全等功能均在这一层处理。

MySQL大多数核心服务均在中间这一层,包括查询解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)。所有的跨存储引擎的功能也在这一层实现:存储过程、触发器、视图等。

最下层为存储引擎,其负责MySQL中的数据存储和提取。和Linux下的文件系统类似,每种存储引擎都有其优势和劣势。中间的服务层通过API与存储引擎通信,这些API接口屏蔽了不同存储引擎间的差异。

MySQL使用基于成本的优化器,它尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个。在MySQL可以通过查询当前会话的last_query_cost的值来得到其计算当前查询的成本。

示例代码

mysql> select * from t_message limit 10;
...省略结果集

mysql> show status like 'last_query_cost';
+-----------------+-------------+
| Variable_name | Value |
+-----------------+-------------+
| Last_query_cost | 6391.799000 |
+-----------------+-------------+

示例中的结果表示优化器认为大概需要做6391个数据页的随机查找才能完成上面的查询。这个结果是根据一些列的统计信息计算得来的,这些统计信息包括:每张表或者索引的页面个数、索引的基数、索引和数据行的长度、索引的分布情况等等。

有非常多的原因会导致MySQL选择错误的执行计划,比如统计信息不准确、不会考虑不受其控制的操作成本(用户自定义函数、存储过程)、MySQL认为的最优跟我们想的不一样(我们希望执行时间尽可能短,但MySQL值选择它认为成本小的,但成本小并不意味着执行时间短)等等。

这里last_query_cost的值是io_cost和cpu_cost的开销总和,它通常也是我们评价一个查询的执行效率的一个常用指标。

(1)它是作为比较各个查询之间的开销的一个依据。

(2)它只能检测比较简单的查询开销,对于包含子查询和union的查询是测试不出来的。

(3)当我们执行查询的时候,MySQL会自动生成一个执行计划,也就是query  plan,而且通常有很多种不同的实现方式,它会选择最低的那一个,而这个cost值就是开销最低的那一个。

(4)它对于比较我们的开销是非常有用的,特别是我们有好几种查询方式可选的时候。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • MySQL8新特性:自增主键的持久化详解

    MySQL8新特性:自增主键的持久化详解

    MySQL8.0 GA版本发布了,展现了众多新特性,下面这篇文章主要给大家介绍了关于MySQL8新特性:自增主键的持久化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • mysql启动失败之mysql服务无法启动(服务没有报告任何错误)的解决方法

    mysql启动失败之mysql服务无法启动(服务没有报告任何错误)的解决方法

    作为一名程序猿,必不可少的便是和mysql打交道,那当mysql故障,服务无法启动时该怎么解决呢,下面这篇文章主要给大家介绍了关于mysql启动失败之mysql服务无法启动,服务没有报告任何错误的解决方法,需要的朋友可以参考下
    2022-05-05
  • 详解MySQL中的事务与ACID特性

    详解MySQL中的事务与ACID特性

    这篇文章主要为大家介绍了Mysql 中的事务,包括事务的基本概念和 ACID 特性、事务的隔离级别和具体实现方法等,并提供相应的代码示例,希望对大家有所帮助
    2023-05-05
  • 怎样安全地关闭MySQL实例

    怎样安全地关闭MySQL实例

    这篇文章主要介绍了怎样安全地关闭MySQL实例,文中讲解非常细致,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-07-07
  • 关于MySQL中Update使用方法举例

    关于MySQL中Update使用方法举例

    这篇文章主要给大家介绍了关于MySQL中Update使用方法的相关资料,更新数据是使用数据库时最重要的任务之一,在本教程中您将学习如何使用MySQL UPDATE语句来更新表中的数据,需要的朋友可以参考下
    2023-11-11
  • MySQL虚拟列的具体使用

    MySQL虚拟列的具体使用

    虚拟列是一种特殊类型的表列,它不像普通列直接存储数据,而是根据其他列中的数据动态生成,本文主要介绍了MySQL虚拟列的具体使用,感兴趣的可以了解一下
    2024-09-09
  • linux 之centos7搭建mysql5.7.29的详细过程

    linux 之centos7搭建mysql5.7.29的详细过程

    这篇文章主要介绍了linux 之centos7搭建mysql5.7.29的详细过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • MySQL学习之数据更新操作详解

    MySQL学习之数据更新操作详解

    这篇文章我们将学习一下用于数据更改的 “UPDATE” 语句, “UPDATE” 语句也是属于 DML 这一类数据库操作语言,感兴趣的可以了解一下
    2022-08-08
  • MySQL约束constraint用法详解

    MySQL约束constraint用法详解

    大家都知道MySQL中经常会需要创建父子表之间的约束,下面这篇文章主要给大家介绍了关于MySQL约束constraint用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • MySQL的主从复制步骤详解及常见错误解决方法

    MySQL的主从复制步骤详解及常见错误解决方法

    这篇文章主要介绍了MySQL的主从复制步骤详解及常见错误解决方法,文中主张同步时跳过临时错误,并对Slave_IO_Running: No错误的解决给出了方案,需要的朋友可以参考下
    2016-02-02

最新评论