重新整理 mysql 基础篇————— 介绍mysql[一]
前言
准备整理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的连接数是有限的,因为人家要维持这么多连接也不容易。
解决方案有两个:
连接池。
长连接。
连接池 比较好理解哈,就是会维护一套自我自己,不会连接太多的数量,反复利用。
长连接,就是像上面一样进行连接,不断开。
长连接有一个坏处,那就是应用程序和mysql 的连接,并不是http这种无状态的,它可能你不断的执行的时候给你记上一些小本本,这样你的连接对象就越来越大了。
定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开
连接,之后要查询再重连。如果你用的是MySQL 5.7或更新版本,可以在每次执行一个比较大的操作后,通过执行
mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,
但是会将连接恢复到刚刚创建完时的状态。
这里面有个查询缓存,这个是来查询如果这条语句前面查询过,那么就直接去缓存里面的值。
上图中缓存没有很好的画好,其实就是查询的时候判断是否有缓存,直接是当前语句的hash值,查询hash表看是否命中,如果这条语句的列的顺序不同,都不会命中。
同样,当启动了缓存,那么当查询完的时候会将该语句的hash值和查询结果放入缓存中。
网上很多人提及到不要开启,因为如果查询语句,只有表发生了改变,这个缓存就失效了,而表很多时候都会进行更新。
也就是说要维护这套缓存机制受益不如不用。
个人觉得还有一个重要的原因,那就是现在强大的缓存架构,如redis 这样的缓存数据库。让应用去觉得哪个去缓存是更好的,所以显得鸡肋了。
分析器:这个比较好理解了,比如我们写一条select * from student,这个东西呢,mysql 根本执行不了,是为了让我们的人类看的懂罢了。
这时候就解析成执行器能够识别的语句。
优化器: 根据mysql能够识别的语法,用一些算法进行优化,比如说索引、表与表的连接。有些可能是负优化,因为算法不可能照顾每一种场景。我们做的就是去迎合优化。
执行器: 这个时候判断是否对这个表有相应的权限,比如说查询、更新权限等,这里就会进行权限缓存,所以这也是我们的连接对象会大的原因之一,这也是为啥我们断开连接新的权限才会生效的原因。
如果权限通过,那么就很好办了,就进行执行,当然其中一些操作会调用到存储引擎,这些后面介绍。
结
以上只是个人重新整理一下mysql,后续一直整理更新。
下一节,日志介绍。
重新整理 mysql 基础篇————— 介绍mysql[一]的更多相关文章
- 重新整理 mysql 基础篇————— 介绍mysql日志[二]
前言 对于后端开发来说,打交道最多的应该是数据库了,因为你总得把东西存起来. 或是mongodb或者redis又或是mysql.然后你发现一个问题,就是他们都有日志系统,那么这些日志用来干什么的呢? ...
- 【目录】mysql 基础篇系列
随笔分类 - mysql 基础篇系列 mysql 开发基础系列22 SQL Model(带迁移事项) 摘要: 一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql m ...
- mysql 基础篇5(mysql语法---数据)
6 增删改数据 -- ********一.增删改数据********* --- -- 1.1 增加数据 -- 插入所有字段.一定依次按顺序插入 INSERT INTO student VALUES(1 ...
- 「MySQL高级篇」MySQL索引原理,设计原则
大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...
- 「 MySQL高级篇 」MySQL索引原理,设计原则
大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...
- MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) - 转载
MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...
- MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码)
MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...
- Mysql基础(二):MySQL之存储引擎
目录 MySQL之存储引擎 1.MySQL存储引擎介绍 2.MySQL结构 3.MySQL存储引擎分类 4.存储引擎的使用 5.总结 MySQL之存储引擎 1.MySQL存储引擎介绍 MySQL中的数 ...
- 《MySQL 基础课程》笔记整理(基础篇)
一.尝试MySQL 1.打开MySQL # 启动MySQL服务 sudo service mysql start # 使用 root 用户登录,这里密码为空,直接回车登录 mysql -u root ...
随机推荐
- Cookie、Session和Token认证
目录 Cookie Session认证机制 Session的一些安全配置 Token认证机制 Token预防CSRF Session认证和Token认证的区别 前言:HTTP是一种无状态的协议,为了分 ...
- hdu5108枚举因子求最小的m
题意: 给一个n(<=10Y),然后让找到一个最小的m使得n/m是一个素数. 思路: 先用sqrt(n)的时间把所有的因子都求出来,然后在排序,枚举,就行了,这个题目这么做 ...
- HTTP参数污染(HPP)漏洞
HPP(HTTP参数污染) HPP是HTTP Parameter Pollution的缩写,意为HTTP参数污染.原理:浏览器在跟服务器进行交互的过程中,浏览器往往会在GET/POST请求里面带上参数 ...
- node-全局对象
Node.js 全局对象 JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量. 全局对象与全局变量 global ...
- 如何在jQuery的Ajax调用后管理一个重定向请求
1 success:function(data){ 2 if(data.xx == "xx") 3 { 4 //code... 5 window.location.href =&q ...
- 启动spring boot项目时报错:java.lang.ClassNotFoundException: javax.servlet.Filter
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- Mac安装python 环境& pychaem
一.文档说明 在Mac上其实自带python环境,但是很多的library安装python是2.7的版本. 验证:可以在终端Terminal中输入:python 如下图是未安装之前,但是咱们需要在自己 ...
- 记一次 .NET 某医院HIS系统 CPU爆高分析
一:背景 1. 讲故事 前几天有位朋友加 wx 抱怨他的程序在高峰期总是莫名其妙的cpu爆高,求助如何分析? 和这位朋友沟通下来,据说这问题困扰了他们几年,还请了微软的工程师过来解决,无疾而终,应该还 ...
- 2020BUAA-团队介绍-采访
团队作业-团队介绍和采访 项目 内容 课程:北航2020软件工程 博客园班级地址 作业要求 团队作业-团队介绍和采访 团队介绍 姓名 有图有真相 个人介绍 刘y 精通(没那么熟悉)c++和python ...
- Springboot项目之阿里云OSS快速入门
阿里云oss 阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量.安全.低成本.高可靠的云存储服务.您可以通过本文档提供的简单的REST接口,在任何 ...