MySQL连接处理方式及最佳并发连接数设置

mysql是单进程,多线程的架构,通过创建多个线程来服务不同的用户连接,通常情况下,随着用户连接数的增加,mysql内部用于处理用户连接的线程也会同步的增长,在一定范围内,增加用户的并发连接,对提高系统的吞吐量有一定的帮助,然而用户并发连接数超过某个阈值,Mysql的性能反而会降低.

mysql连接处理方式

Mysql内部处理用户连接的方式严格来说有三种

  1. 单线程处理所有的用户连接,一般在调试时使用

  2. 多线程处理用户连接,一个线程对应一个用户连接,也是Mysql默认连接处理方式

  3. 线程池处理用户连接,一个线程对应多个用户连接,比如MysqlPercona发行版提供了线程池功能

线程缓存

Mysql默认的连接处理方式,即一个线程对应一个用户连接,在某些场景下,有一些性能问题,比如大量的短连接,短时间内大量的连接创建和销毁,意味着Mysql内部必须要有同样数量的线程创建和销毁,线程的创建,销毁以及线程上下文切换,会带来严重的性能消耗,因此Mysql开发者提出了线程缓存的概念,缓存一定数量的线程来服务用户连接,用户连接到来,先检查线程缓存中有没有可用的线程,如果没有再去创建,如果有,直接使用线程缓存中的线程,用户连接断开时,线程放回线程缓存中,以便后来的用户连接重用,减少线程频繁创建和销毁

代表用户连接的数据结构THD

用户连接在MySQL实现中由一个数据结构THD表示,THD在连接建立时被创建,在连接断开时销毁,用户连接与THD的关系永远是一对一的关系,THD不能跨连接重用,THD结构大概有10K大小,它是一个C++类,在 sql_class.h文件中定义。THD用于记录各种执行状态,在SQL语句执行的过程中,THD会根据实际情况申请内存使用,尤其对于复杂的SQL,THD占用的内存大小会不断增长,平均下来,一个连接大概10M左右。

设置合适的连接数

MySQL能够处理的最大连接数量由参数 max_connections 决定,但是如何设置 max_connections 的值才是最合适的呢?一般来说需要根据具体的机器配置和业务要求。通常我们需要MySQL能够并发处理的用户连接数越多越好,并发用户数增加的情况下,SQL的执行响应时间不能增长太多,同时内存占用也不能太高,因此需要在并发连接数、响应时间、内存占用等方面做出平衡,并且要能满足业务的对SQL执行的吞吐量和响应时间要求。

如何确定MySQL的最大负载和最大并发度?通过压测,不断增加客户端并发数。比如起始客户端并发数为2,依次递增到4,8,16,32等等,每次递增,在没有达到性能瓶颈前,压测的TPS会随着客户端并发数的增加而增大,响应时间通常会随着客户端并发数的增加而增加,但是增加的幅度并不明显。当客户端并发数达到某个阈值时,比如128,或者256甚至更大时,TPS不再增长,反而出现下降,响应时间则会出现跳跃式的增长,此时则可以认为MySQL已经达到了当前配置的最大性能。不同的硬件配置下,MySQL最大性能的并发连接数也不相同,需要根据具体的环境测试,一般的原则是最大并发连接数等于CPU逻辑核心数的4倍。

此外,如果业务对响应时间有一定的要求,比如业务要求响应时间50ms,在低于50ms的响应时间之内,TPS越高越好。这时就需要通过压测来确定最合适的并发连接数,在响应时间不超过50ms的前提下,不断提高并发数,获取最佳性能。然而不同的机器配置,不同的业务类型,可能会有不同的结果。

下图展示了某个测试环境下,MySQL最佳性能的并发数,在并发128之前,随着并发数的增加,TPS也相应增加,响应时间平稳,然而超过128,可以看到TPS出现下降,并且响应时间增加明显。

简化理解

有三种连接方式
.单线程模式,处理所有的用户连接
.多线程处理,一个线程对应一个用户(mysql默认的方式)
.线程池处理用户连接,一个线程池对应多个用户连接
线程缓存

  如果短时间创建和销毁线程(大量的短连接),会存在性能上的问题,mysql中有线程缓存的概念,缓存一定的线程来服务用户的连接,用户来之前,先检查缓存线程中是否有可以使用的线程,如果没有就再去创建,如果有,直接使用线程缓存中的线程,用户连接断开后,线程放回到线程缓存中,以便后来的用户连接重用,减少了频繁创建和销毁

代表用户数据结构THD

每个用户连接在mysql中都是右一个数据结构THD表示,THD在连接建立时被创建,在连接断开时销毁,
用户连接和THD是一对一的关系,THD不能跨连接重用,THD结构大约有10k左右,它是一个C++类,
THD用户记录各种执行状态,在sql语句执行过程中,THD会根据实际情况申请内存使用,尤其对于复杂的sql,THD占用的内存大小会不断增长,平均下来一个链接大约10M左右

MySQL连接处理方式及最佳并发连接数设置的更多相关文章

  1. mysql命令行方式添加用户及设置权限

    以前总是喜欢通过phpmyadmin去添加用户和数据库,这次装完系统后,配置了一大堆东东,实在不想安装phpmyadmin了,就通过命令行方式创建了数据库和设置权限,记录一下,免得以后总是百度 关键步 ...

  2. delphixe7支持MYSQL连接的方式

    由于工作需要,给出配套能用的版本,目前仅在win10 64位 XE7测试通过,如果换成其他环境,请根据自己的环境使用如下路径的dbxmys.dll 32位系统 E:\Program Files (x8 ...

  3. mysql 连接超时的问题

    项目中用mycat做的分表分库,异步通知系统会连接mycat去查数据库数据,有时会抛异常提示mysql server has gone away.最初以为是mycat的问题,在修改了mycat的配置, ...

  4. MySQL 连接方式

    MySQL 连接方式 1:TCP/IP 套接字方式 这种方式会在TCP/IP 连接上建立一个基于网络的连接请求,一般是client连接跑在Server上的MySQL实例,2台机器通过一个TCP/IP ...

  5. php和mysql连接方式(短 长 池)

    一个php work进程只能处理一个请求,当完成一个请求了,才能处理下一次的请求 2.短连接: 执行到php关闭mysql连接的代码时,就断开,否则在处理本次请求结束的时候,释放mysql连接 实验: ...

  6. 连接mysql的各种方式

    mysql连接操作是客户端进程与mysql数据库实例进程进行通信.从程序设计角度来说,属于进程通信,常用进程通信包括: 管道.Tcp/Ip 套接字.UNIX域套接字. 1.TCP/IP (1)使用最多 ...

  7. MySQL连接服务端的几种方式

    一.MySQL 连接本地数据库,用户名为“root”,密码“123456”: D:\>mysql -h localhost -u root -p123456 注意:“-p”和“123456” 之 ...

  8. 安装Hive(独立模式 使用mysql连接)

    安装Hive(独立模式 使用mysql连接) 1.默认安装了java+hadoop 2.下载对应hadoop版本的安装包 3.解压安装包 tar zxvf apache-hive-1.2.1-bin. ...

  9. Java Mysql连接池配置和案例分析--超时异常和处理

    前言: 最近在开发服务的时候, 发现服务只要一段时间不用, 下次首次访问总是失败. 该问题影响虽不大, 但终究影响用户体验. 观察日志后发现, mysql连接因长时间空闲而被关闭, 使用时没有死链检测 ...

随机推荐

  1. zuul网管配置其他服务时 HTTP Status 500 – Internal Server Error

    1.这个错误是由三个原因导致的 (1).我在给类的接口命名的时候前面少加了一个/ (2)给zuul配置路由的时候多加了个服务名,serviceId名称就是spring的name,而不是eureka注入 ...

  2. 微信小程序开发入门教程(四)---自己动手做个小程序

    前面已将基础知识准备的差不多了,下面实际做一个小程序. 一.目标 用于上传照片和文字. 2个主要页面:我me,设置set 二.开始制作 1.打开微信开发者工具(我用的1.02.1907160 Wind ...

  3. 快速掌握Python的捷径-Python基础前传(1)

    文: jacky(朱元禄) 开文序 最近看新闻,发现高考都考Python了,随着人工智能的火热,学数据科学的人越来越多了!但对于数据行业本身来说,现象级的火热,这并不是什么好事. 方丈高楼平地起,无论 ...

  4. sql到python正则

    import urllib.requestimport re,timeresult=[]for i in range(100):    urls ="http://xxx.com/-1%20 ...

  5. PHP反序列化学习

    在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对 ...

  6. Golang 函数耗时统计

    当时候需要去计算一段代码或一个程序所消耗时间的时候,就需要进行统计时间,用程序去计算某一段代码的执行所需要的时间远比用眼睛直接去看程序运行时间高很多. go语言中的time包中提供了函数来提供计算消耗 ...

  7. 【零基础】入门51单片机图文教程(Proteus+Keil)

    参考资料: https://www.jianshu.com/p/88dfc09e7403 https://blog.csdn.net/feit2417/article/details/80890218 ...

  8. SpringMVC和AJAX交互

    在实际开发中我们经常需要前后台交互,那么springmvc与ajax之间交互这里记录下在实际开发中遇到的细节问题. jsp页面: <fieldset id="login" s ...

  9. centos7 下安装和配置 mongodb (重点)

    1.下载安装包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.4.tgz 2.解压 tar -zxvf m ...

  10. linux下如何更新当前的容器镜像?

    docker commit <container_id> <container_image_name>