在做MySQL数据的性能定位前,需要先知道MySQL查询时数据库内部的执行过程。只有弄清SQL的执行过程,才能对执行过程中的每一步的性能做定位分析。如图6-2-1所示。

图6-2-1

从图中可以看到,当查询出数据以后,会将数据先返回给执行器,此时执行器先将结果写到查询缓存里面,这样在下次查询相同的数据时,就可以直接从缓存中查询并且返回,同时将结果返回给客户端。分析器会对待查询的SQL语句做执行计划的分析,而优化器会对SQL语句做重新优化,以便SQL的查询性能达到最佳。

6.2.1  慢SQL

每条SQL语句在执行时都需要消耗一定的I/O资源,SQL语句执行的快慢直接决定了硬件资源被占用时长的长短,慢SQL一般指查询很慢的SQL语句。在MySQL数据库中,可以通过慢查询来查看所有执行超时的SQL语句。在默认情况下,一般慢SQL是关闭的,可以通过执行show variables like 'slow_query%' 来查看数据库是否开启了慢查询,如图6-2-2所示。

图6-2-2

从图6-2-2中看到slow_query_log的值为OFF表示慢查询未开启,可以通过执行命令“set global slow_query_log=1; ”或者“set global slow_query_log=ON;”来临时开启慢查询,如图6-2-3所示。

图6-2-3

如果需要永久开启,就需要修改/etc/my.cnf配置文件,在[mysqld]处加入如下配置,再重启数据库即可生效,如下所示。

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

slow_query_log=ON

slow_query_log_file=/var/lib/mysql/localhost-slow.log

修改完成重启数据库后,再次执行show variables like 'slow_query%',发现慢查询已经被开启,如图6-2-4所示。

图6-2-4

通过执行“show variables like 'long_query%';”可以查询慢查询的记录时间,如图6-2-5所示。慢查询的记录时间默认是10秒,可以通过执行“set long_query_time=需要修改的时长;”来修改慢查询的记录时间。

图6-2-5

通过执行“show status like 'slow_queries';”可以查看慢查询发生的次数,如图6-2-6所示。

图6-2-6

从慢查询日志中,我们也可以看到慢查询发生的详细信息,如图6-2-7所示。慢查询日志中会记录每次慢查询发生的时间、执行查询时的数据库用户、线程id、查询执行的SQL语句等信息。

图6-2-7

在获取到慢查询的SQL语句后,就可以借助数据库的执行计划来对慢查询的SQL语句做进一步的分析。(节选自《软件性能测试、分析与调优实践之路》(第2版),作者张永清,转载请注明出处)

6.2.2  执行计划

在MySQL中使用explain关键字可以模拟查看数据库是如何执行SQL查询语句,也就是常说的查看一条SQL语句在数据库中的执行计划。图6-2-8所示就是执行EXPLAIN SELECT * FROM test.test 后返回的SELECT * FROM test.test查询的执行计划。

图6-2-8

查询结果返回的字段说明如下所示。

(1)id。查询的顺序编号,表示查询中执行的顺序。id的值越大,执行的优先级越高;如果id相同,则从上往下执行。

(2)select_type。查询类型,常见查询类型说明如下:

  • SIMPLE:表示简单查询方式。SQL语句中一般不会不使用UNION和子查询等。
  • PRIMARY:表示包含子查询的SQL语句的最外层查询语句的查询类型,即当查询中包含子查询时,最外层的查询语句就会显示为PRIMARY。
  • UNION:在查询语句中,如果在UNION关键字之后出现了第二个SELECT,则被标记为UNION。
  • UNION RESULT:表示查询中有多个查询结果集执行UNION操作。
  • DEPENDENT UNION:表示在子查询中存在UNION操作时,从UNION之后的第二个及之后的SELECT语句都是DEPENDENT UNION。
  • DEPENDENT SUBQUERY:子查询中UNION 中第一个SELECT查询为DEPENDENT SUBQUERY。
  • SUBQUERY:子查询内层查询的第一个SELECT。
  • DERIVED:在查询语句中,如果from子句的子查询中出现了union关键字,则外层select查询将被标记为DERIVED。
  • MATERIALIZED:表示子查询被物化,物化通过将子查询结果作为一个临时表来加快查询执行速,从而能够使得子查询只执行一次。
  • UNCACHEABLE SUBQUERY:表示查询结果集无法缓存的子查询,需要逐次查询。
  • UNCACHEABLE UNION:表示子查询不可被物化,需要逐次运行(即需要执行多次)    (节选自《软件性能测试、分析与调优实践之路》(第2版),作者张永清,转载请注明出处)

(3)table。查询涉及的表名或者表的别名。

(4)type。表示表连接的类型,包括的类型说明如下。这些类型的性能从高到低的顺序是null→system→const→eq_ref→ref→fulltext→ref_or_null→index_merge→unique_subquery→index_subquery→range→index→ALL。

  • null:表示不访问任何的表。
  • system:表示表中只有一条记录,相当于系统表。一般可以认为是const类型的特例。
  • const:表示主键或者唯一索引的常量查询,表中最多只有1行记录符合查询要求。通常const使用到主键或者唯一索引进行定值查询、常量查询,查询的速度非常快。
  • eq_ref:表示join 查询过程中,关联条件字段使用主键或者唯一索引,出来的行数不止一行。eq_ref是一种查询性能很高的 join 操作。
  • ref:表示非聚集索引的常量查询。
  • fulltext:表示查询的过程中,使用了fulltext类型的索引。
  • ref_or_null:跟ref查询类似,在ref的查询基础上会多加一个null值的条件查询。
  • index_ merg:表示索引联合查询。
  • unique_ subquery:表示查询使用主键的子查询。
  • index_subquery:表示查询使用非聚集索引的子查询。
  • range:表示查询通过使用索引范围的查询。一般包括:=、<>、>、>=、<、<=、IS NULL、BETWEEN、IN、<=> 等范围。
  • index:表示通过索引进行扫描查询。
  • ALL:表示全表扫描,性能最差。

(5)possible_keys。查询时预计可能会使用的索引。这里说的索引只是可能会用到,实际查询不一定会用到。

(6)key。实际查询时真实使用的索引。

(7)key_len。使用的索引长度。

(8)ref 。关联信息。

(9)rows。查询时扫描的数据记录行数。

(10)extra。表示查询特性的使用情况。常用的查询特性如下所示:

  • Using index:表示使用了索引(通常也可以叫覆盖索引)。
  • Using index condition:表示使用了索引进行过滤。
  • Using MRR:表示使用了索引进行内部排序。
  • Using where:表示使用了where条件。
  • Using temporary:表示使用了临时表。
  • Using filesort:表示使用文件排序(一般指无法利用索引来完成的排序)。

6.2.3  MySQL数据库性能定位步骤

MySQL数据库性能定位的常见步骤总结如图6-2-8所示。

图6-2-8

(1)首先通过本书第2章中服务器的性能监控与分析,找到当前服务器的资源使用情况,重点关注CPU、内存、磁盘等使用率。

(2)根据服务器资源的使用率情况,初步判断当前MySQL数据库可能在执行的操作类型。(节选自《软件性能测试、分析与调优实践之路》(第2版),作者张永清,转载请注明出处)

  • 如果是内存和CPU使用率过高,或者磁盘读取数据频繁,说明可能存在大量SQL查询或者统计计算操作。
  • 如果是磁盘写入频繁,说明可能存在大量频繁的insert或者update 操作。

(3)通过在数据库中执行SHOW FULL PROCESSLIST 命令观察当前正在运行的SQL 命令,可以每间隔5~10s 多执行几次该命令,找到哪些SQL操作是持续一直在运行中。

  • 如果是insert 或者update 语句,通过查看本书的6.1.2小节中的知识讲解,来查看MySQL数据库当前运行的事务与锁,获取insert 或者update的SQL操作是否存在锁等待等情况,从而导致insert和update 一直处于等待中。
  • 如果是查询操作,可以结合慢查询日志一起,找到慢查询的SQL语句,使用explain关键字查看SQL的执行计划来定位SQL为什么查询慢。

(节选自《软件性能测试、分析与调优实践之路》(第2版),作者张永清,转载请注明出处)

《软件性能测试分析与调优实践之路》第二版-手稿节选-Mysql数据库性能定位与分析的更多相关文章

  1. 软件性能测试分析与调优实践之路-Web中间件的性能分析与调优总结

    本文主要阐述软件性能测试中的一些调优思想和技术,节选自作者新书<软件性能测试分析与调优实践之路>部分章节归纳. 在国内互联网公司中,Web中间件用的最多的就是Apache和Nginx这两款 ...

  2. 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选

    Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...

  3. 软件性能测试分析与调优实践之路-JMeter对RPC服务的性能压测分析与调优-手稿节选

    一.JMeter 如何通过自定义Sample来压测RPC服务 RPC(Remote Procedure Call)俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用 ...

  4. MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选

    1  .MySQL数据库的性能监控 1.1.如何查看MySQL数据库的连接数 连接数是指用户已经创建多少个连接,也就是MySQL中通过执行 SHOW  PROCESSLIST命令输出结果中运行着的线程 ...

  5. 高并发场景下JVM调优实践之路

    一.背景 2021年2月,收到反馈,视频APP某核心接口高峰期响应慢,影响用户体验. 通过监控发现,接口响应慢主要是P99耗时高引起的,怀疑与该服务的GC有关,该服务典型的一个实例GC表现如下图: 可 ...

  6. mysql 数据库性能追踪与分析

    http://bbs.linuxtone.org/thread-20601-1-1.html

  7. Java 应用性能调优实践

    Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具和思路,给出搜狗商业平台的性 ...

  8. [转载]Java 应用性能调优实践

    Java 应用性能调优实践 Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具 ...

  9. MindSpore模型精度调优实践

    MindSpore模型精度调优实践 引论:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,为MindSpore量身定做了可视化调试调优组件:MindInsight. ...

  10. Java GC 专家系列3:GC调优实践

    本篇是”GC专家系列“的第三篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种G ...

随机推荐

  1. UOS 开启 VisualStudio 远程调试 .NET 应用之旅

    本文记录的是在 Windows 系统里面,使用 VisualStudio 2022 远程调试运行在 UOS 里面 dotnet 应用的配置方法 本文写于 2024.03.19 如果你阅读本文的时间距离 ...

  2. dotnet 读 WPF 源代码笔记 简单聊聊文本布局换行逻辑

    在 WPF 里面,带了基础的文本库功能,如 TextBlock 等.文本库排版的重点是在文本的分行逻辑,也就是换行逻辑,如何计算当前的文本字符串到达哪个字符就需要换到下一行的逻辑就是文本布局的重点模块 ...

  3. LVGL SCROLL循环滚动

    一.案例测试 这里我使用LVGL的版本是8.3.3 运行案例 lvgl_examples\scroll\lv_example_scroll_6 效果如下所示 二.现象 这里先描述一下现象,当我们使用 ...

  4. 还需要学习JDBC吗?如果需要该了解到怎么样的程度?

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 不知道大家在工作中还有没有写过JDBC,我在大三 ...

  5. Partition和ReduceTask的关系

    先看源码: numPartitions = conf.getNumReduceTasks(); if (numPartitions > 1) { //设置了ReduceTask个数后(大于1), ...

  6. 程序员天天 CURD,怎么才能成长,职业发展的思考(2)

    接着上一篇:程序员天天 CURD,怎么才能成长,职业发展思考 上一篇写到了用年限来谈程序员的发展,在 4 - 6 年这个时间段需要做的一些事情,接着写这个时间段的. 第 4.5 年时候,你可能会做一些 ...

  7. docker-compose搭建的Mysql主主复制

    注意下面几点: 1)要保证同步服务期间之间的网络联通.即能相互`ping`通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口). 2)关闭selinux. 3)同步前,双方数据库中需要同步 ...

  8. Vue3学习(二十四)- 文档页面功能开发

    写在前面 这部分真的感觉超级难,其实也不能说难,主要是真的想不到这个思路应该这么做,或者说他好厉害,他怎么知道该这么设计实现. 说下难点吧,我觉得后天逻辑还好,主要是前端部分真的需要点花点时间来思考, ...

  9. 现代农业|AIRIOT智慧农业管理解决方案

    ​ 智慧农业是现代化技术在农业领域的应用和成果,其中物联网技术在促生产.保产量和降本增效方面起到了至关重要的作用.运用传感技术和软件平台系统对农业生产进行智能化平台化管理,解决掉传统农业问题的诸多痛点 ...

  10. AIRIOT物联网低代码平台如何配置MQTT驱动?

    MQTT驱动配置简介 MQTT全称为消息队列遥测传输(英语:Message Queuing Telemetry Transport),是ISO 标准(ISO/IEC PRF 20922)下基于发布 ( ...