当MySQL服务器本身遇到性能问题的时候,一般可以通过slow log来找到耗时比较多的SQL语句,并且进一步通过explain来优化和改进SQL执行速度。这种方法有这几方面的限制:首先,并不是所有的问题都是因为异常SQL造成的,当大量SQL请求时间比较长,但不到slow log阈值的时候(通常线上无法将slow log阈值设置的较小),MySQL服务器负载也会很高;其次,MySQL服务器本身的状态会影响SQL的执行,有一些没有问题的SQL语句在MySQL负载较高时,也会进入slow log。

另外一种方法是通过MySQL的Performance Schema、Innodb status以及MySQL status等MySQL统计信息来定位问题;这通常需要对MySQL的实现有相当的了解;并且定位问题不是非常直接。

本人认为除了以上两种办法之外,可以通过strace MySQL的线程来定位性能瓶颈。这种方法可以定位出因为系统IO(包括网络)、内存、线程同步(MySQL锁使用错误)等造成的问题;也就是说,如果能确定MySQL Server不存在大量需要在用户态进行的计算(例如浮点运算、字符串处理等),都可以尝试使用此方法。

下面将介绍MySQL线程相关的一些信息,以MySQL5.6.29为例,MySQL5.7会有一些不一样。

1、多线程程序

MySQL只有一个进程,使用多线程实现并发。使用InnoDB作为存储引擎的情况下,主要关注MySQL和InnoDB创建的线程。

可以使用MySQL的Performance Schema.threads表来查看MySQL的线程。这个表含所有MySQL创建并活跃的线程以及部分InnoDB线程。

2、线程池

每次和MySQL Server建立连接,MySQL服务器都会创建或分配一个线程处理对应的请求。

MySQL会维护一个线程池管理这些工作线程。只有当工作线程的正在响应请求时,才会进入Performance Schema.threads表。可以通过向MySQL进程发送SIGHUP信号来释放所有的线程并创建一个只有一个线程的线程池。

3、InnoDB线程

InnoDB会创建很多功能线程(都是运行期间常驻线程),用于处理异步任务。但也许InnoDB有很多代码是临时工写的,有部分线程没有使用MySQL提供的Performance Schema机制注册到threads表中。

4、线程对应

由于threads表中没有包含线程的系统id,甚至由于第2点和第3点的原因(部分线程不会出现在threads)表中,因此无法通过threads表将MySQL的线程对应到系统线程。

以下表为本人梳理的线程创建顺序及数量,可以通过将MySQL服务器按照线程ID进行排序,然后一一对应上。(注:由于MySQL在启动过程中需要创建一些临时线程,因此MySQL的线程ID并不是连续的)

下表所列CPU时间为本人的线上环境的某一个从库的时间。

创建顺序线程名称线程数量线程作用CPU时间

1main1主线程

2innodb ibuff io thread1innodb inser buff写入和读取线程0s

3innodb log io thread1innodb undo log写入和读取线程1s

4innodb read threadsinnodb_read_io_threadsinnodb数据库文件read ahead线程9s*8

5innodb write threadsinnodb_write_io_threadsinnodb数据库文件写入线程2m*8

6lock_wait_timeout_thread1watches the timeouts for lock waits0.99s

7srv_error_monitor_thread1warns of long semaphore waits33s

8srv_monitor_thread1prints InnoDB monitor info0.15s

9srv_master_thread1does purge and other utility operations4s

10srv_purge_coordinator_thread1redo log清理1h

11srv_worker_threadinnodb_purge_threads – 1purge worker0

12buf_flush_page_cleaner_thread1flush page53m

13buf_dump_thread1buffer pool dump/load thread0s

14dict_stats_thread1dict stats gathering thread0.11s

15fts_optimize_thread1Optimize all FTS tables0.15s

16signal_handler1signal handler thread0s

17slave_io1slave io19m

18slave_sql1slave sql11h

19connectionnhandler0

下一节,本人将分享关于使用strace跟踪线程的操作经验。

mysql的worker 线程_MySQL线程相关推荐

  1. mysql 线程池大小设置_MySQL线程池参数解析

    线程池是数据库系统非常重要功能,然而MySQL社区版并不包含线程池功能,不过好在MySQL的Percona发行版本提供了这个功能,除此之外,MySQL的企业版也提供线程池,从性价比上说,Percona ...

  2. mysql 线程_MySQL服务器线程数的查看方法详解

    本文实例讲述了MySQL服务器线程数的查看方法.分享给大家供大家参考,具体如下: mysql重启命令: /etc/init.d/mysql restart MySQL服务器的线程数需要在一个合理的范围 ...

  3. mysql服务器多线程模型_java 线程池、多线程并发实战(生产者消费者模型 1 vs 10) 附案例源码 - 陈彦斌 - 博客园...

    导读 前二天写了一篇<Java 多线程并发编程>点我直达,放国庆,在家闲着没事,继续写剩下的东西,开干! 线程池 为什么要使用线程池 例如web服务器.数据库服务器.文件服务器或邮件服务器 ...

  4. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  5. mysql 并发锁表_MySQL锁表的用法,防止并发情况下的重复数据

    早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...

  6. mysql 写binlog 原理_MySQL binlog原理及应用

    01 概述 Binlog它记录了所有的DDL和DML(除了数据查询语句)语句,以事件(EVENT)形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. 一般来说开启二进制日志 ...

  7. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...

  8. 【Android 异步操作】线程池 ( 线程池 reject 拒绝任务 | 线程池 addWorker 添加任务 )

    文章目录 一.线程池 reject 拒绝任务 二.线程池 addWorker 添加任务 在上一篇博客 [Android 异步操作]线程池 ( 线程池 execute 方法源码解析 ) 中 , 讲解 线 ...

  9. mysql 乐观锁 脏读_mysql 丢失更新1和2、脏读、不可重复读和幻读 事务隔离级别 悲观锁 乐观锁...

    事务是现代关系型数据库的核心之一.在多个事务并发操作数据库(多线程.网络并发等)的时候,如果没有有效的避免机制,就会出现以下几种问题: ( 第一类丢失更新 A事务撤销时,把已经提交的B事务的更新数据覆 ...

最新文章

  1. vba获取通达信光标的坐标数据_「高阶应用」谈一下VB6和VBA的坐标系统
  2. 镗孔指令g76格式_11种孔加工固定循环指令+1个案例=完美解决孔加工问题
  3. Android爬坑之旅之WebView
  4. 笔记 - AliCloud 云数据库 简介
  5. ZOJ 2165 Red and Black
  6. 关于java结构中描述正确的是_下列关于Java中类的构造方法的描述,正确的是()...
  7. android 高德地图 sh1,百度、高德地图获取发布版(Release)SHA1
  8. Python字符串与列表间的相互转化
  9. html选中然后显示到表格,如何将数据从html表单显示到表格中?
  10. 2019澳门理工计算机作品决赛,我校学子在2019年泛珠三角+大学生计算机作品赛总决赛中斩获佳绩...
  11. Windows 下的 electron 开发笔记一
  12. c语言背包问题(动态规划解法)
  13. C# 开发Chrome内核浏览器(WebKit.net)
  14. 最新:斐讯K3千兆无线路由器刷官改版固件的详细图文教程
  15. linux运行roon,Roon + HQPlayer + NAA + 解码 网线直连方案
  16. windows 安装cab文件
  17. Java面试题(上)
  18. 使用联想智能引擎的电脑,将会懂你的心思
  19. 瑞合信LED字幕WiFi卡使用教程(8.0版)
  20. 使用多可用区Kubernetes进行灾难恢复

热门文章

  1. DateGridView列的输出顺序反了
  2. 虚拟机网络连接方式linuxcentos
  3. RabbitMQ超详细安装教程(Linux)
  4. 合肥工业大学—SQL Server数据库实验六:数据更新操作
  5. TVM 图优化Graph Optimization
  6. TensorRT 7.2.1 开发概要(下)
  7. RGB-D对红外热像仪和毫米波雷达标定
  8. 商城数据库表设计介绍
  9. [JavaScript] Map类型在JavaScript中的使用
  10. Adnroid文件存储路径getFilesDir()与getExternalFilesDir的区别