MySQL优化之连接优化

 更新时间:2017年03月12日 11:07:25   作者:roverliang  
MySQL连接优化主要指客户端连接数据库以及数据库为响应客户端的请求而打开数据表和索引的过程中涉及到的参数调整。下面我们来详细的探讨下

上文MySQL优化之缓存优化 这篇文章中提到了一个很重要的概念,就是show variables是用来表示系统编译或者配置在my.cnf中的变量值。而show status则称之为状态值,显示的是当前服务实例运行所具有的状态信息,是一个动态改变的值。因此常用来观测当前MySQl的运行是否正常,如果不正常那么依靠调整静态参数来提高MySQL的性能。所以明白这两个概念的不同,是后面调优的基础。

MySQL 连接优化

记得有一次在公司内部连接MySQL的时候,总是连接不上。找到DBA后,经过排查原因,是当前MySQL连接数满了,经过调整后,解决了问题。引发连接数过多的错误原因一般有两个,第一的确是有很多人在连接MySQL,造成连接数用完。第二种是max_connections值过小。

1、连接参数(show variables)

mysql> show variables like '%connect%';
+-----------------------------------------------+-----------------+
| Variable_name                 | Value      |
+-----------------------------------------------+-----------------+
| character_set_connection           | utf8      |
| collation_connection             | utf8_general_ci |
| connect_timeout                | 10       |
| disconnect_on_expired_password        | ON       |
| init_connect                 |         |
| max_connect_errors              | 100       |
| max_connections                | 151       |
| max_user_connections             | 0        |
| performance_schema_session_connect_attrs_size | 512       |
+-----------------------------------------------+-----------------+ 

max_connections是指MySQL服务实例能够同时接受的的最大并发连接数。MySQL实际上支持最大连接数加一的算法,保障当连接数用完的时候,超级管理员依然可以和服务端建立连接,进行管理。

max_user_connections设置指定账号的最大并发连接数。

max_connect_errors 当某台非法主机恶意连接MySQL服务端,遭到的错误达到设置值后,MySQL会解决来自该主机的所有连接。但执行flush hosts后会清零。

2、连接状态(show status)

有一点需要注意的,变量值(show variables)是以小写字母开头的,而状态值(show status)是以大写字母开头。这样区分有助于记忆和分类

mysql> show status like '%connections%';
+-----------------------------------+-------+
| Variable_name           | Value |
+-----------------------------------+-------+
| Connection_errors_max_connections | 0   |
| Connections            | 197  |
| Max_used_connections       | 2   |
+-----------------------------------+-------+

Connection_errors_max_connections 当MySQL的最大并发数大于系统变量(show variables)中max_connections的最大并发数,因此而被拒绝的次数,将会记录在这个变量里。如果Connection_error_max_connections值比较大,则说明当前系统并发比较高,要考虑调大max_connections的值。

Connections表示MySQL从启动至今,成功建立连接的连接数,这个值是不断累加的。

Max_used_connections表示MySQL从启动至今,同一时刻并发的连接数,取得是最大值。如果这个值大于 max_connections则表明系统经常处于高并发的状态,应该考虑调大最大并发连接数。

3、连接线程参数(thread variabls and status)

mysql> show variables like 'thread%';
+--------------------+---------------------------+
| Variable_name   | Value           |
+--------------------+---------------------------+
| thread_cache_size | 9             |
| thread_concurrency | 10            |
| thread_handling  | one-thread-per-connection |
| thread_stack    | 262144          |
+--------------------+---------------------------+

thread_cache_size 设置连接线程缓存的数目。这个缓存相当于MySQL线程的缓存池(thread cache pool),将空闲的连接线程放入连接池中缓存起来,而非立即销毁。当有新的连接请求时,如果连接池中有空闲的连接,则直接使用。否则要重新创建线程。创建线程是一个不小的系统开销。MySQL的这部分线程处理和Nginx 的线程处理有异曲同工之妙,以后介绍Nginx的线程处理时,会拿来做对比。

thread_handling 默认值是: one-thread-per-connection 表示为每个连接提供或者创建一个线程来处理请求,直至请求完毕,连接销毁或者存入缓存池。当值是no-threads 时,表示在始终只提供一个线程来处理连接,一般是单机做测试使用的。

thread_stack stack 是堆的意思,由PHP 进程详解这篇博客,知道进程和线程都是有唯一的ID的,进程的ID系统会维护,二线程的ID,则由具体的线程库区维护,当进程或者线程休眠的时候,进程的上下文信息要在内存中开辟出一块区域,保存进程的上下文信息,以便于迅速唤醒程序。默认为MySQL的每个线程设置的堆栈大小为:262144/1024=256k

查看线程状态信息

mysql> show status like 'Thread%';
+-------------------+-------+
| Variable_name   | Value |
+-------------------+-------+
| Threads_cached  | 1   |
| Threads_connected | 1   |
| Threads_created  | 2   |
| Threads_running  | 1   |
+-------------------+-------+

Thread_cached 当前线程池的线程数

Thread_connected 当前的连接数

Thread_cached: 当前连接线程创建数, 如果这个值过高,可以调整threadcachesize 也就是调整线程缓存池的大小。

Thred_runnint: 当前活跃的线程数。

连接请求堆栈

MySQL在很短的时间内,突然收到很多的连接请求时,MySQL会将不能来得及处理的连接请求保存在堆栈中,以便MySQL后续处理。back_log参数设置了堆栈的大小,可以通过如下命令查看:

mysql> show variables like 'back_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| back_log   | 80  |
+---------------+-------+

连接异常

mysql> show status like 'Aborted%';
+------------------+-------+
| Variable_name  | Value |
+------------------+-------+
| Aborted_clients | 0   |
| Aborted_connects | 219  |
+------------------+-------+

Aborted_clients MySQL 客户机被异常关闭的次数。

Aborted_connects 试图连接到MySQL服务器而失败的连接次数。

other

mysql> show status like 'Slow%';
+---------------------+-------+
| Variable_name    | Value |
+---------------------+-------+
| Slow_launch_threads | 0   |
| Slow_queries    | 0   |
+---------------------+-------+

mysql> show variables like 'slow_launch_time';
+------------------+-------+
| Variable_name  | Value |
+------------------+-------+
| slow_launch_time | 2   |
+------------------+-------+

Slow_lunch_threads 创建线程的时间过长,超过slow_launch_time的设定值,则会记录。

可以通过使用 Connection_error%来查看连接的错误状态信息:

mysql> show status like 'Connection_error%';
+-----------------------------------+-------+
| Variable_name           | Value |
+-----------------------------------+-------+
| Connection_errors_accept     | 0   |
| Connection_errors_internal    | 0   |
| Connection_errors_max_connections | 0   |
| Connection_errors_peer_address  | 0   |
| Connection_errors_select     | 0   |
| Connection_errors_tcpwrap     | 0   |
+-----------------------------------+-------+

Connection_errors_peer_address 查找MySQL客户机IP地址是发生的错误数。

相关文章

  • 一文带你了解MySQL之约束

    一文带你了解MySQL之约束

    在SQL标准中,一共规定了6种不同的约束,包括非空约束,唯一约束和检查约束等,而在MySQL中是不支持检查约束的,所以这篇文章先对其余5种约束做一个详解和练习,需要的朋友可以参考下
    2023-06-06
  • Windows 下 MySQL 8.X 的安装教程

    Windows 下 MySQL 8.X 的安装教程

    这篇文章主要介绍了Windows 下 MySQL 8.X 的安装教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • 虚拟机linux端mysql数据库无法远程访问的解决办法

    虚拟机linux端mysql数据库无法远程访问的解决办法

    最近在项目搭建过程中遇到一问题,有关虚拟机linux端mysql数据库无法远程访问,通过查阅相关数据库资料问题解决,下面把具体的解决办法分享给大家,有需要的朋友可以参考下
    2015-08-08
  • MySQL数据库必知必会之安全管理

    MySQL数据库必知必会之安全管理

    MySQL数据库通常包含关键的数据,为确保这些数据的安全和完整,需要利用访问控制和用户管理的功能,下面这篇文章主要给大家介绍了关于MySQL数据库必知必会之安全管理的相关资料,需要的朋友可以参考下
    2022-05-05
  • MySQL 5.7 mysql command line client 使用命令详解

    MySQL 5.7 mysql command line client 使用命令详解

    这篇文章主要介绍了MySQL 5.7 mysql command line client 使用命令,需要的朋友可以参考下
    2017-06-06
  • Can''t connect to MySQL server的解决办法

    Can''t connect to MySQL server的解决办法

    ERROR 2003 (HY000): Can't connect to MySQL server on '*.*.*.*' (113)的解决办法
    2010-06-06
  • mysql下完整导出导入实现方法

    mysql下完整导出导入实现方法

    对于大量数据的导入导出,是件挺麻烦的事,需要考虑很多的细节,这类对于需要大量数据导入导出的朋友可以参考下。
    2010-12-12
  • MySQL的重装问题解决方法

    MySQL的重装问题解决方法

    最近在工作上遇到了MySQL重装的问题,今天记录一下我的解决过程。不论我用控制面板的卸载删除程序方式还是安全卫士的卸载,都会遇到一个问题,就是安装到如下图位置,server start时就程序无响应了,一直死在那里
    2013-04-04
  • MySQL中的流式查询及游标查询方式

    MySQL中的流式查询及游标查询方式

    这篇文章主要介绍了MySQL中的流式查询及游标查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • mysql数据自增ID为2的解决方案

    mysql数据自增ID为2的解决方案

    这篇文章主要介绍了mysql数据自增ID为2的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论