MySQL 是支持多种通信协议的,可以使用同步/异步的方式,支持长连接/短连接。
1.同步/异步
异步的问题
- 异步可以避免应用阻塞等待,但是不能节省 SQL 执行的时间。
- 如果异步存在并发,每一个 SQL 的执行都要单独建立一个连接,避免数据混乱。线程的上下文切换,会增加服务器压力
- 增加编程复杂度
默认是同步,即客户端需要等mysql服务器的响应,也是符合大多数情况的。
2. 长连接/短连接
短连接就是操作完毕以后,马上 close 掉。长连接可以保持打开,减少服务端创建和释放连接的消耗,后面的程序访问的时候还可以使用这个连接。一般我们会在连接池中使用长连接。
相关命令
2.1.查询连接超时时间
show global variables like "wait_timeout"; -- 非交互式超时时间, 如 JDBC 程序
show global variables like "interactive_timeout"; -- 交互式超时时间, 如数据库工具
默认都是 28800 秒,8 小时。
2.2.查询和设置连接状态
2.2.1 查询连接状态
show global status like "Thread%";
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_cached | 649 | <—当前被缓存的空闲线程的数量
| Threads_connected | 93 | <—正在使用(处于连接状态)的线程
| Threads_created | 742 | <—服务启动以来,创建了多少个线程
| Threads_running | 5 | <—正在忙的线程(正在查询数据,传输数据等等操作)
+-------------------+-------+
2.2.2 查看开机起来数据库被连接了多少次
show status like "%connections%";
show global status like "%connections%";
+-----------------------------------+---------------------+
| Variable_name | Value |
+-----------------------------------+---------------------+
| Connection_errors_max_connections | 0 |
| Connections | 101395055 | <–服务启动以来,历史连接数
| Max_used_connections | 742 |
| Max_used_connections_time | 2018-08-21 15:42:38 |
+-----------------------------------+---------------------+
2.2.3 设置thread_cache_size
通过连接线程池的命中率来判断设置值thread_cache_size是否合适, 命中率超过90%以上,设定合理。 (Connections - Threads_created) / Connections * 100 %>=90%
2.3 查询执行状态
SHOW PROCESSLIST;
2.4查询和设置最大连接数
查看配置
show variables like "max_connections";
在 5.7 版本中默认是 151 个,最大可以设置成 16384(2^14)。
设置配置
set global max_connections = 1000;
3.通信协议
1.Unix Socket。
2. TCP/IP
mysql -h192.168.8.211 -uroot -p123456
我 们 的 编 程 语 言 的 连 接 模 块 都 是 用 TCP 协 议 连 接 到 MySQL 服 务 器 的 , 比 如 mysql-connector-java-x.x.xx.jar。
3. 命名管道(Named Pipes)
4. 内存共享(Share Memory)
这两种通信方式只能在 Windows 上面使用,一般用得比较少。
4.通信方式
- 单工: 在两台计算机通信的时候,数据的传输是单向的。生活中的类比:遥控器。
- 半双工: 在两台计算机之间,数据传输是双向的,你可以给我发送,我也可以给你发送, 但是在这个通讯连接里面,同一时间只能有一台服务器在发送数据,也就是你要给我发 的话,也必须等我发给你完了之后才能给我发。生活中的类比:对讲机。
- 全双工: 数据的传输是双向的,并且可以同时传输。生活中的类比:打电话。 MySQL采用半双工方式
SQL命令一次性发送
客户端发送 SQL 语句给服务端的时候,(在一次连接里面)数据是不能分成小块发送的,不管你的 SQL 语句有多大,都是一次性发送 比如我们用 MyBatis 动态 SQL 生成了一个批量插入的语句,插入 10 万条数据,values后面跟了一长串的内容,或者 where 条件 in 里面的值太多,会出现问题。 相关配置max_allowed_packet,默认4M
执行结果一次性发送
服务端来说,也是一次性发送所有的数据,不能因为你已经取到了想要的数据就中断操作,这个时候会对网络和内存产生大量消耗
#参考资料 1.https://mp.weixin.qq.com/s/PEk97JyIlUexuAjFr2pmiw