前言

准备整理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能够识别的语法,用一些算法进行优化,比如说索引、表与表的连接。有些可能是负优化,因为算法不可能照顾每一种场景。我们做的就是去迎合优化。

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

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

以上只是个人重新整理一下mysql,后续一直整理更新。

下一节,日志介绍。

重新整理 mysql 基础篇————— 介绍mysql[一]的更多相关文章

  1. 重新整理 mysql 基础篇————— 介绍mysql日志[二]

    前言 对于后端开发来说,打交道最多的应该是数据库了,因为你总得把东西存起来. 或是mongodb或者redis又或是mysql.然后你发现一个问题,就是他们都有日志系统,那么这些日志用来干什么的呢? ...

  2. 【目录】mysql 基础篇系列

    随笔分类 - mysql 基础篇系列 mysql 开发基础系列22 SQL Model(带迁移事项) 摘要: 一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql m ...

  3. mysql 基础篇5(mysql语法---数据)

    6 增删改数据 -- ********一.增删改数据********* --- -- 1.1 增加数据 -- 插入所有字段.一定依次按顺序插入 INSERT INTO student VALUES(1 ...

  4. 「MySQL高级篇」MySQL索引原理,设计原则

    大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...

  5. 「 MySQL高级篇 」MySQL索引原理,设计原则

    大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...

  6. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) - 转载

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

  7. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...

  8. Mysql基础(二):MySQL之存储引擎

    目录 MySQL之存储引擎 1.MySQL存储引擎介绍 2.MySQL结构 3.MySQL存储引擎分类 4.存储引擎的使用 5.总结 MySQL之存储引擎 1.MySQL存储引擎介绍 MySQL中的数 ...

  9. 《MySQL 基础课程》笔记整理(基础篇)

    一.尝试MySQL 1.打开MySQL # 启动MySQL服务 sudo service mysql start # 使用 root 用户登录,这里密码为空,直接回车登录 mysql -u root ...

随机推荐

  1. 反病毒攻防研究第004篇:利用WinRAR与AutoRun.inf实现自启动

    一.前言 由之前的一系列研究可以发现,为了使得"病毒"能够实现自启动,我也是煞费苦心,采取了各种方式,往往需要编写冗长的代码并且还需要掌握系统底层或注册表的很多知识才可以.而这次我 ...

  2. PAT 乙级 -- 1006 -- 换个格式输出整数

    题目简述 让我们用字母B来表示"百".字母S表示"十",用"12-n"来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整 ...

  3. LA3602DNA序列

    题意:      给你一个一些DNA序列(只有ACGT)然后让你构造一个序列,使得所有的序列到他的Hamming距离最小,所有的序列包括构造的序列长度都是N,Hamming表示两个序列的不同字符位置个 ...

  4. POJ3422简单费用流

    题意:      给一个n*n的矩阵,从左上角走到右下角,的最大收益,可以走k次,每个格子的价值只能取一次,但是可以走多次. 思路:       比较简单的一个费用流题目,直接拆点,拆开的点之间连接两 ...

  5. Windows核心编程 第四章 进程(中)

    4.2 CreateProcess函数 可以用C r e a t e P r o c e s s函数创建一个进程: BOOL CreateProcessW( _In_opt_ LPCWSTR lpAp ...

  6. CentOS运行多个Tomcat操作步骤

    一:修改环境变量 在/et/profile文件追加以下内容 # tomcat1 env ( 第一个tomcat 的环境变量) export CATALINA_HOME=/usr/local/apach ...

  7. [源码解析] 并行分布式框架 Celery 之 容错机制

    [源码解析] 并行分布式框架 Celery 之 容错机制 目录 [源码解析] 并行分布式框架 Celery 之 容错机制 0x00 摘要 0x01 概述 1.1 错误种类 1.2 失败维度 1.3 应 ...

  8. 关于有符号数和无符号数的转换 - C/C++

    转载自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题, ...

  9. 北航OO(2020)第二单元博客作业

    第二单元第一次作业 多线程设计策略 第一次作业的想法是设计三个线程:输入线程,调度器线程以及电梯线程.输入线程获取请求并发送给调度器线程:调度器线程通过查询电梯线程的状态(等待.停靠以及移动),并综合 ...

  10. [MySQL数据库之事务、读现象、数据库锁机制、多版本控制MVCC、事务隔离机制]

    [MySQL数据库之事务.读现象.数据库锁机制.多版本控制MVCC.事务隔离机制] 事务 1.什么是事务: 事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻 ...