写点什么

重新整理 mysql 基础篇————— 介绍 mysql[一]

发布于: 2021 年 06 月 09 日

前言

准备整理 mysql 的基础篇了,前面整理了 sql 语句序列的的《sql 语句系列(八百章)》,感觉很多用不上,就停下来了,后续还是会继续整理。

mysql 基础篇主要是对一些基础进行整理,同时望请大佬能够指点一二。之所以整理 mysql,而不是 sql server,一个是因为 sql server 相对来说稳定,同时 sql server 水很深,后续会整理一些被 sql server 折磨的经历。

这里说一句公道话,sql server 从综合来说的确比 mysql 强,不然人家也不好意思收费。但是我们很多场景 mysql 就足够了,mysql 效率也不低,因为不用考虑到很多的场景,故而少量数据查询可能比 sql server 要好。

其实谈那个性能怎么样,怎么怎么好,是没有意义的,主要看怎么用吧,一个设计不好的数据库,引擎再怎么好,也是泥坑。

好吧,下面就开始整理一下,比较基础。

正文

网上有很多图说明 mysql 的内部结构,我这里重新化了一下:



好像市面上比较喜欢聊的 InnoDB 就属于存储引擎,存储引擎 可以说是数据库的核心。

如果把 mysql 比作一台电脑的话,那么连接器就是登陆界面。 查询缓存就是内存。 分析器和优化器就相当于编译器。 执行器就相当于 cpu。存储引擎就相当于文件系统。

还是那句话吧,任何一件东西都不是凭空产生,肯定有前面的借鉴之处,这里面就借鉴了一些电脑整体架构的东西,又是一个套娃系统。

先来介绍一下连接器。

连接器,既然是连接的,那么要保证两个问题,一个是安全,一个是快速。

快速呢,这个可以通过高效的协议搞定。

安全呢,通过验证机制搞定。

mysql 的这一套安全机制和连接协议其实是比较简单的,这里不细说,可以百度看看。

如果我们连接上了,那么我们可以去进行查看:



在写完 show processlist 后面我又加了一个;,这条语句才执行了。

里面查询到两个,第一个呢,是我使用工具进行连接,状态是 sleep。第二个是我们命令行界面进行了连接。

我这样打开一个库:



那么我们再 show processlist 一下:



又进行了一个连接。

那么这里想说明的是,其实一个应用的连接数其实比我们想象的多。

如果我们的客户端和服务器的连接一直 sleep 状态,那么 8 小时后又会断开。

因为应用一般每秒处理很多请求,故而请求非常多,连接数自然非常多了,而 mysql 的连接数是有限的,因为人家要维持这么多连接也不容易。

解决方案有两个:

  1. 连接池。

  2. 长连接。

连接池 比较好理解哈,就是会维护一套自我自己,不会连接太多的数量,反复利用。

长连接,就是像上面一样进行连接,不断开。

长连接有一个坏处,那就是应用程序和 mysql 的连接,并不是 http 这种无状态的,它可能你不断的执行的时候给你记上一些小本本,这样你的连接对象就越来越大了。

  1. 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。

  2. 如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

这里面有个查询缓存,这个是来查询如果这条语句前面查询过,那么就直接去缓存里面的值。

上图中缓存没有很好的画好,其实就是查询的时候判断是否有缓存,直接是当前语句的 hash 值,查询 hash 表看是否命中,如果这条语句的列的顺序不同,都不会命中。

同样,当启动了缓存,那么当查询完的时候会将该语句的 hash 值和查询结果放入缓存中。

网上很多人提及到不要开启,因为如果查询语句,只有表发生了改变,这个缓存就失效了,而表很多时候都会进行更新。

也就是说要维护这套缓存机制受益不如不用。

个人觉得还有一个重要的原因,那就是现在强大的缓存架构,如 redis 这样的缓存数据库。让应用去觉得哪个去缓存是更好的,所以显得鸡肋了。

分析器:这个比较好理解了,比如我们写一条 select * from student,这个东西呢,mysql 根本执行不了,是为了让我们的人类看的懂罢了。

这时候就解析成执行器能够识别的语句。

优化器: 根据 mysql 能够识别的语法,用一些算法进行优化,比如说索引、表与表的连接。有些可能是负优化,因为算法不可能照顾每一种场景。我们做的就是去迎合优化。

执行器: 这个时候判断是否对这个表有相应的权限,比如说查询、更新权限等,这里就会进行权限缓存,所以这也是我们的连接对象会大的原因之一,这也是为啥我们断开连接新的权限才会生效的原因。

如果权限通过,那么就很好办了,就进行执行,当然其中一些操作会调用到存储引擎,这些后面介绍。


原文链接:https://www.cnblogs.com/aoximin/p/14865162.html



用户头像

还未添加个人签名 2021.03.15 加入

还未添加个人简介

评论

发布
暂无评论
重新整理 mysql 基础篇————— 介绍mysql[一]