1.应用场景

学习MySQL数据库连接原理和性能优化, 开发高性能程序.

2.学习/操作

1. 文档阅读

MySQL 数据库连接原理和性能优化 - 高性能 MySQL 实战 | Laravel 学院

05丨检索数据:你还在SELECT * 么?-极客时间

2. 整理输出

2.1 常见的 MySQL 客户端

MySQL 服务端启动之后,就可以通过客户端建立与服务端的连接,然后发送查询/更新请求了。

我们可以通过 MySQL 安装目录 bin 目录下的 mysql 二进制文件在终端窗口通过命令行建立与 MySQL 服务端的连接,

也可以通过图形化客户端软件建立这种连接(比如 MySQL Workbench、Navicat For MySQL、DataGrip、TablePlus、Sequel Pro 等 )。

参考:DBMS - GUI/可视化管理工具_穿素白衫的少年的博客-CSDN博客_dbms下载  // DBMS - 可视化管理工具

此外,我们在 PHP、Go、Python、Java 这些后端编程语言中使用的数据库 SDK 也是一种 MySQL 客户端,只不过这些 SDK 对数据库连接做了封装而已。

Note:

SDK  abbr. 软件开发工具包(Software Development Kit)

以上都是日常开发过程中经常打交道的 MySQL 客户端,这里,为了更接近底层原理,我们使用 mysql 命令建立与服务端的连接。

2.2 MySQL 命令解析

我们可以通过如下命令格式建立数据库连接:

mysql -h主机名 -P端口号 -u用户名 -p密码

注:如果 MySQL 服务端监听的端口号是默认的 3306 的话,可以省略端口号

(如果想要使用其他端口号,可以在启动服务端时通过命令行参数或者配置文件指定)。

我们以默认的 root 用户为例,在终端窗口通过如下命令即可建立与本地 MySQL 服务端的连接:

这里我们通过 -h 指定 MySQL 服务端所在的主机 IP 地址,这里是本地 IP 地址 127.0.0.1

通过 -u 指定用户名是 root

通过 -p 指定对应的密码是 root

虽然可以通过这种方式比较便捷地指定密码信息,但是如果是连接到生产环境 MySQL 服务器,则不建议这么做,因为这样会导致密码的泄露,取而代之地,可以通过如下这种交互式方式输入密码发起连接请求:

这样一来,输入的密码信息就不可见了。

连接成功后,我们就可以通过这个交互式界面来操作 MySQL 数据库了。

在进行下一步操作之前,我们先来看看 MySQL 客户端是如何建立与服务端的连接的。

2.3 数据库连接过程

不管是 MySQL 服务端还是客户端,本质上都是计算机的进程,所以这个连接过程和通过浏览器(HTTP 客户端)请求指定网站(HTTP 服务端)连接建立过程并无二致,都是进程之间的通信。只不过后者是 HTTP 请求,基于 HTTP 协议,而前者是 TCP 请求,基于 TCP 协议。

注:虽然 MySQL 也支持 TCP 请求之外的其他连接建立方式,比如 Unix 套接字,但是我们日常使用的通常都是基于 TCP 连接的,这里就以此为例进行讲解。

学院君在网络协议的传输层协议中已经介绍过 TCP 通信的原理,既然是 TCP 请求,那么通信的双方 —— MySQL 客户端和服务端需要具备必要的进程信息:源 IP 地址、源端口号、目标 IP 地址、目标端口号,这样才能建立可靠连接,这里的目标 IP 地址就是 MySQL 服务端所在的 IP 地址,上面的示例是 127.0.0.1,目标端口号就是 MySQL 服务端进程的端口号,默认是 3306

所以从这个角度来说,通过 mysql 命令建立与服务端的连接和通信,必须指定服务端主机(IP 地址或者主机名)和端口号(默认是 3306,可以省略,但如果不是 3306,则必须指定)。

在完成经典的 TCP 握手后,服务端就要开始认证你的身份,这个时候用的就是你输入的用户名和密码:

A.如果用户名或密码不对,就会收到一个 Access denied for user 的错误,然后客户端程序结束执行: 

B.如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限,之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。这就意味着,一个用户成功建立连接后,即使对这个用户的权限做了修改,也不会影响已经存在连接的权限,只有新建的连接才会使用新的权限设置。

2.4 数据库连接状态

连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,你可以在 show processlist 命令中看到它:

其中的 Command 列显示为 Sleep 的行,表示一个空闲连接。

客户端如果太长时间没动静,连接器就会自动将它断开,这个时间是由参数 wait_timeout 控制的,默认值是 28800 秒(也就是 8 小时)。

你可以通过 show global variables 命令查看这个配置值:

show global variables like 'wait_timeout';

你可以通过 MySQL 配置文件修改这个默认配置(mysqld 分组下配置即可)。

如果连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒:Lost connection to MySQL server during query

2.5 长连接与短连接

在 MySQL 数据库中,还有长连接与短连接的概念:

A.长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接,对应在 Web 应用中,就是后端程序与数据库之间的连接建立之后,就会一直重用这个连接(为了提升数据库并发性,可以建立一个数据库连接池);

B.短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个,对应在 Web 应用中,就是后端程序与数据库建立连接,完成查询/更新后,就断开连接,下次操作数据库再重连。

这个和 HTTP 长连接和短连接的概念很像,并且显然,无论是 HTTP 还是 MySQL,使用长连接都能有效减少建立连接过程带来的损耗,进而提升性能。

不过在 MySQL 中,使用长连接会有一定的副作用 —— 有些时候会导致 MySQL 占用内存涨得特别快。

这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的,这些资源只有在连接断开的时候才会释放。

对于这个问题,通常有两种解决方案:

A.定期断开长连接:使用一段时间,或者程序里判断执行过一个占用较大内存的查询后,主动断开连接;

B.如果使用的是 MySQL 5.7 或者更高版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。

关于 MySQL 客户端与服务端的连接,以及连接状态和类型我们就简单介绍到这里.

下篇教程,我们更进一步,来探究一条 SQL 查询语句在 MySQL 客户端和服务端之间都经历了哪些曼妙之旅,

最后把查询结果返回给客户端的。

后续补充

...

3.问题/补充

TBD

4.参考

MySQL 数据库连接原理和性能优化 - 高性能 MySQL 实战 | Laravel 学院

05丨检索数据:你还在SELECT * 么?-极客时间

后续补充

...

【性能优化】MySQL 数据库连接原理和性能优化 - 学习/实践相关推荐

  1. Mysql索引原理剖析与优化策略

    Mysql索引原理剖析与优化策略 1.索引的本质  在⽣产环境中,随着数据量不断的增⻓,SQL执⾏速度会越来越慢,常⻅的⼿段就是通过索引来提升查询速度,那么究竟为什么要添加索引?应该如何正确添加索引? ...

  2. 【微机原理与接口技术学习实践】汇编语言程序设计初步——debug编写调试指令序列

    halo~我是bay_Tong桐小白 本文内容是桐小白个人对所学知识进行的总结和分享,知识点会不定期进行编辑更新和完善,了解最近更新内容可参看更新日志,欢迎各位大神留言.指点 [微机原理与接口技术学习 ...

  3. mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...

    这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时 ...

  4. MySQL索引原理与性能调优

    MySQL 应该是最流行的后端数据库,尽管 NOSQL 近几年越来越火爆,可是相信大部分架构师还是会选择 MySQL 来做数据存储. 作为一名Java程序员相信MySQL我们都不陌生,但真的了解MyS ...

  5. [数据库]MySQL索引原理和深度优化

    一.摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如 ...

  6. 逆向课程第四讲逆向中的优化方式,除法原理,以及除法优化上

    一丶为什么要熟悉除法的优化,以及除法原理 是这样的,在计算机中,除法运算对应的汇编指令分为 DIV(无符号除法指令) 以及 IDIV(有符号除法指令). 但是,除法指令的执行周期较长效率很低.所以编译 ...

  7. MySQL主从原理,基于快速学习一门技术的3种方式!

    根据经验,想要快速学习一门技术有3种方式. 第一种方式是通过代码来理解它的实现,反推它的逻辑. 这种方式的难度很大,而且起点相对高,能够沉浸其中的人非常少,过程相对来说是苦闷的,但如果能够沉下心来看代 ...

  8. MySQL 数据存储和优化------MySQL架构原理 ---- (架构---索引---事务---锁---集群---性能---分库分表---实战---运维)持续更新

    Mysql架构体系全系列文章主目录(进不去说明还没写完)https://blog.csdn.net/grd_java/article/details/123033016 本文只是整个系列笔记的第一章: ...

  9. 简单的优化mysql,提高查询性能

    其实下面要讲的优化方法都是大家熟悉的,只是对于自己来说,是前进了一小步,而且看到结果很满意.免不了有点高兴,所以就写下来. [size=large]问题:在php中用select语句查询mysql数据 ...

最新文章

  1. android小球移动代码,Android自定义圆形View实现小球跟随手指移动效果
  2. v-html解析的相对地址img 显示不出来_人工智能专题作品解析——APPInventor安卓应用开发AI图像识别简单应用...
  3. 用Discuz/UCenter账号实现Wifi登录认证
  4. C++ STL下载和安装
  5. 七个C#编程的小技巧
  6. 一张图看懂CSS cascade, specific, importance, inheritance
  7. CentOS7部署NFS
  8. 读书笔记2013第3本:《无价》
  9. (计算机组成原理)第五章中央处理器-第三节1:CPU内部单总线数据通路中数据的流动
  10. 接口测试---mock变量自定义变量的使用
  11. Golang的GC和内存逃逸
  12. Linux 设备模型
  13. cad注释比例和打印比例不一样_CAD中输出不同比例图纸效率不高,原因在这里
  14. 181104每日一句
  15. 都说苹果秋季发布会像一杯白开水,那么...
  16. 8,JESD204B协议介绍
  17. python爬取有道翻译的代码_有道翻译的爬取
  18. 如何记忆 Spring Bean 的生命周期
  19. 云创大数据荣膺英特尔“行业贡献奖”
  20. 设置py文件在pycharm里的工作环境/路径

热门文章

  1. 为什么-128的补码是1000 0000?
  2. 最牛啤的Java后端框架,没有之一!
  3. 合并多个js,css文件的方法:在服务端合并js和css文件
  4. 苹果/Mac电脑在哪里开启勿扰模式?
  5. python砍价代码_【微擎微赞模块】砍价宝4.5小程序版+小程序前端+后端+素材包+砍价+抢购+拼团...
  6. Linux使用vim编辑文本时字体背景颜色变为黄色 解决办法
  7. 本地电脑远程使用服务器 jupyter notebook及主题更换
  8. 算法1.3.插入排序
  9. UML图箭头关系简介
  10. MAD,现代安卓开发技术:Android 领域开发方式的重大变革~