Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >回龙观大叔狂磕mysql(第一回)

回龙观大叔狂磕mysql(第一回)

作者头像
用户2825413
发布于 2021-04-08 06:23:12
发布于 2021-04-08 06:23:12
46200
代码可运行
举报
运行总次数:0
代码可运行

我有一个程序员朋友, 我们都叫他回龙观大叔, 因为他所在公司经营不善, 被动离职。我们一起听听他的故事.

回龙观大叔的自述

距离上次面试过去两天了, 但仍未能抹平心灵的创伤, 上次面试问了我几个mysql问题, 都没能很好的答上来.

比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. mysql B+树是什么结构?
2. mysql 事务是怎么是实现的?
3. 你先回去等通知吧

最后我心都凉了, 质问了面试官几句, 问这些对工作有啥用? 有真正考察到我的实力吗? 随后我就生气走了.

回龙观某小区出租屋中, 喝着上周剩下的半瓶可乐, 坐在电脑前边刷微信边找工作, 吐槽着人生不公与公司的冷漠.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
? juejin 又有活动了? 小册免费学? 

作为薅羊毛上瘾的我来说, 自然也不会错过这根羊毛, 买个 mysql 小册吧, 时代变了, 得学点基础原理应付应付面试了.

狂磕 mysql 第一面

客户端与服务器是怎么连接

未来的面试官如果问我: 客户端与服务器是怎么连接的呀?

我会先漏出一丝微笑以示尊重, 然后答:

mysql有三种连接方式, TCP/IP、命名管道和共享内存和Unix域套接字文件, 但是我们一般都使用的是 TCP/IP 模式的, 因为后面两个只能客户端与服务端在同一机器上, 但是作为核心基础数据库, 我们一般都分开部署的.

指定默认端口 3306, 端口可以在启动 mysql 的时候使用 -P 指定, max_connections 指定同时最大连接数

mysql是怎么接收请求并处理的

未来面试官肯定的点了点头, 再问我: mysql是怎么接收请求并处理的

我再答:

mysql处理请求一共分为三大步骤 连接管理、解析与优化、存储引擎.

顺便找面试官要张纸, 我要把整体结构画出来!!!

image.png

面试官你看最上面对外连接管理这个框, 一个请求进来, 首先要建立连接(TCP三次握手), mysql 会从线程池里面分配一个线程来处理当前请求

数据库也肯定需要账号密码, 需要检测账号密码合法性和权限, 如果鉴权失败就会返回错误信息, 处理线程释放到池等待下一次请求.

比如面试官你提个问题, 我背这么多东西, 得想想是哪块的知识, 你看这个解析优化就是做这个的. 一个 sql 语句给到 mysql, mysql 得分析下 sql 吧, 定位到具体的表和条件.

有时候别人已经查过了, 就没必要再查一次, 查询缓存模块就是干这个用的, 但是缓存在mysql中还是有些问题, 他是根据传进来的sql生成的缓存key, sql语句大小写、随机函数都会 cache miss, 有严重的锁争用, 这个在新版本已经被移除掉了.

查询优化是根据行数、实际查询进行调整优化, 核心有限过滤大部分数据.

存储引擎是我们存储数据方式的不同而使用不同的引擎, 一般我们默认使用 innodb 引擎

创建表可以指定, 也可以使用 default-storage-engine 指定默认引擎

关于 mysql 字符集

面试官不耐烦的听完讲了上面问题后, 问: mysql的字符集遇到过什么问题? 不要偏离主题.

我会答:

utf8mb3:阉割过的utf8字符集,只使用1~3个字节表示字符。

utf8mb4:正宗的utf8字符集,使用1~4个字节表示字符。

在MySQL中utf8是utf8mb3的别名,utf8就意味着使用1~3个字节来表示一个字符,如果使用4字节编码一个字符的情况,比如存储一些emoji表情啥的,那请使用utf8mb4, 英文、数字等只使用一个字符即可表示.

字符集和字符编码区别

字符集和字符编码的关系,字符集是规范,字符编码是规范的具体实现;字符集规定了符号和二进制代码值的唯一对应关系,但是没有指定具体的存储方式;unicode、ASCII、GB2312、GBK都是字符集;其中ASCII、GB2312、GBK既是字符集也是字符编码;注意不混淆这两者区别;而unicode的具体实现有UTF-8,UTF-16,UTF-32。

Innodb 存储行数据底层原理

存储引擎是管理组织我们数据的地方, 存储有很多类型, 目前一般主要使用 Innodb, 它的流行并不是偶然, 支持事务、行锁、聚簇索引等都有很多优势, 面试官之后会问的, 我就先不说了.

Innodb 会为表加一些隐藏列:

列名

作用

DB_ROW_ID

行ID,唯一标识一条记录

DB_TRX_ID

事务ID

DB_ROLL_PTR

回滚指针

InnoDB表对主键的生成策略:优先使用用户自定义主键作为主键,如果用户没有定义主键,则选取一个Unique键作为主键,如果表中连Unique键都没有定义的话,则InnoDB会为表默认添加一个名为row_id的隐藏列作为主键

Compact格式存储

一个不定长字符串存储占用空间( varchar(xx) )

  1. 真实数据
  2. 真实数据占用字节的长度
  3. NULL值标识,如果该列有NOT NULL属性则可以没有这部分存储空间

VARCHAR(M)类型的列最多可以占用 65535 个字节, 但是我们有额外的空间占用, 最多可存储 65532 个字符(长度占用两个字符、NULL标记占用1个)

如果指定 NOT NULL, 可使用 65533 个字节, utf8mb4 最多有4个字节, 最多存储 16383 个字符(65533/4).

MySQL中磁盘和内存交互的基本单位是页,也就是说MySQL是以页为基本单位来管理存储空间的,我们的记录都会被分配到某个页中存储。而一个页的大小一般是16KB,也就是16384字节, 建议单行记录不要超过此大小, 否则会发生行溢出, 超出的部分放到其他页称为页溢出.

一个页需要132字节空间记录信息, 每个条需要最多 27 字节记录额外信息, 每page页最少展示两行记录, 所以需要额外减掉

顺利通关

好啦好啦~ 估计面试官会让我等会儿~ 进入二面.

《(第二回合)回龙观大叔狂磕mysql》敬请期待~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 呆呆熊的技术路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
(第三回合)回龙观大叔狂磕mysql
这次狂磕mysql系列进入了第三回合, 回龙观大叔清明节约了我去体育公园打网球, 休息之余问了下他最近的情况, 说这两天对人生有了更多的思考, 听完后感觉很惊悚, 之后我再抽机会分享下他那悲观的心态.
用户2825413
2021/04/08
4380
(第三回合)回龙观大叔狂磕mysql
回龙观大叔狂磕mysql(第二回)
同学, 还记得上一回说的回龙观大叔面试的故事嘛? 回龙观大叔狂磕mysql(第一回) 经过上一回合的学习, 这位大叔终于找回了点自信, 这次又投了几家公司, 不过现在还没有公司去联系他. 大叔的电脑桌
用户2825413
2021/04/08
5750
回龙观大叔狂磕mysql(第二回)
MySQL 系列教程之(一)初识 MySQL
其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?客户端可以向服务器发送增删改查各类请求,我们这里以比较复杂的查询请求为例来画个图展示一下大致的过程:
ruochen
2021/08/03
7110
MySQL 系列教程之(一)初识 MySQL
Python数据库操作 Mysql数据库表引擎与字符集#学习猿地
![](./imgs/752951346A5F4E7EBDE362FA97107707.png)
学习猿地
2020/03/20
6980
MySQL | VARCHAR(200)能存200个汉字吗?
在数据库设计中,选择合适的数据类型对于确保数据的有效存储和查询效率至关重要。对于需要存储文本信息的场景,我们常会使用VARCHAR类型。 然而,对于不同语言的字符,VARCHAR所能存储的数量会有所不同。
烟雨平生
2024/04/17
4.1K0
MySQL | VARCHAR(200)能存200个汉字吗?
如何给对象解释为什么不能在 MySQL 中使用 UTF-8 编码
MySQL 是业务后台系统经常用到的结构化数据库。 掌握 MySQL 相关知识是研发人员必备的能力。 与此同时,在面试过程当中,MySQL 的知识点也是经常被当做面试题目,以此来考量候选人的能力。
Java程序猿
2021/06/10
1.1K0
MySQL中使用utf8的见解
《MySQL中的utf8,真假?》中曾提到MySQL的utf8字符集问题,碰巧看到技术社群的这篇文章《为什么不建议在 MySQL 中使用 utf8 ?》给出一些网友对这个问题的观点,可以学习参考。
bisal
2025/01/07
2390
MySQL中使用utf8的见解
MySQL字符集你还在使用错误的utf8?
所有在使用“utf8”的MySQL和MariaDB用户都应该改用“utf8mb4”,永远都不要再使用“utf8”。
JavaEdge
2021/02/22
1.3K0
MySQL字符集你还在使用错误的utf8?
❤️爆肝3万字,最硬核丨Mysql 知识体系、命令全集 【建议收藏 】❤️
数据库(Database)就是按照数据结构来组织,存储和管理数据的仓库 专业的数据库是专门对数据进行创建,访问,管理,搜索等操作的软件,比起我们自己用文件读写的方式对象数据进行管理更加的方便,快速,安全
不吃西红柿
2022/09/19
6440
❤️爆肝3万字,最硬核丨Mysql 知识体系、命令全集 【建议收藏 】❤️
Mysql字符集(1)--mysql从入门到精通(二)
上篇文章我们说了mysql客户端与服务端连接过程,分为tcp/ip连接,之后读取缓存,sql解码,语句优化,存储引擎:
keying
2022/07/26
3840
MySQL VARCHAR(M)最多能存储多少数据
MySQL定义VARCHAR(M)最多可以是65535个字节,M表示的是「字符数量」,但是实际存储中并不能存储那么多字节。如果一个字段超过了65535个字节,可以选择使用TEXT或者BLOB类型。
索码理
2022/09/20
1K0
能让你Hold住面试官的Mysql 数据页结构及索引底层原理总结(文末附新春红包福利)
最近接受了深圳开源中国(也就创作和运营马云中国gitee网络的公司)科技公司面试官的电话面试,面试过程中面试官要求我谈一谈Mysql的数据结构。笔者当时只记得Mysql数据库的InnoDB存储引擎底层用到了B+树,对于什么是B+树以及InnoDB数据页结构的了解也不多,所以当时面试回答得很肤浅。很明显结果凉凉了,所以决定写篇文章系统地总结这个问题给自己加深印象,下次面试官再问这一块的问题,保证绝对不再翻车!
用户3587585
2022/09/21
6140
能让你Hold住面试官的Mysql 数据页结构及索引底层原理总结(文末附新春红包福利)
Mysql字符集-Mysql进阶(一)
计算机上可以运行多个程序,比如QQ,微信,idea,每个程序就是一个进程(PID),mysql服务器和客户端本质就是一个进程,进程都有唯一id,简称PID。
keying
2022/12/14
2.7K0
MySQL的varchar水真的太深了——InnoDB记录存储结构
  InnoDB处理数据的过程是发生在内存中的,需要把磁盘中的数据加载到内存中,如果是处理写入或修改请求的话,还需要把内存中的内容刷新到磁盘上。
IT大咖说
2021/06/15
2.2K1
MySQL的varchar水真的太深了——InnoDB记录存储结构
MySQL行格式原理深度解析
MySQL中的行格式(Row Format)是指存储在数据库表中的数据的物理格式。它决定了数据是如何在磁盘上存储的,以及如何在查询时被读取和解析的。MySQL支持多种行格式,每种格式都有其特定的优点和适用场景。
公众号:码到三十五
2024/03/19
9570
MySQL行格式原理深度解析
mysql架构sql基础
clear \c 在客户端有命令打错的情况后面跟上相当于ctrl+c 在5.6中ctrl+c就退出客户端了
萧晚歌
2021/11/30
9360
第06期:梳理 MySQL 字符集的相关概念
用途:用来映射简单的单字节字符,比如大小写英文字母、阿拉伯数字、常用的标点符、运算符、控制字符等。
爱可生开源社区
2020/06/15
1.1K0
谨记不要在MySQL中使用“utf8”编码
这里我们直接指定了nickname字段的字符编码为utf8,然后我向里面插入一条普通数据,使用mybatis的插入数据库语句如下:
Dream城堡
2022/05/10
1.3K0
谨记不要在MySQL中使用“utf8”编码
MySQL数据库设计规范
MySQL数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。在数据库变更和处理流程、数据库表设计、SQL编写等方面予以规范,从而为公司业务系统稳定、健康地运行提供保障。
物流IT圈
2019/07/16
2.4K0
MySQL数据库设计规范
MySQL字符集utf8和utf-8的关系
什么是字符集(character set) 字符的二进制编码方式 二进制编码到一套字符的映射 二进制->编码->字符 校对规则(collation) 在字符集内用于比较字符的一套规则 ASCII码 1个字节由8个二进制位组成 1个字节可表示256种不同的状态(256个不同符号) ASCII码规定了128个字符(英文字符和一些标点符号)的编码 Unicode国际化支持 世界上存在多种编码方式,同一个二进制数字被解释成了不同的符号 现存 编码 不能在多语言环境中使用,诞生了Unicode(统一码) 一个字符的
星哥玩云
2022/08/17
8980
相关推荐
(第三回合)回龙观大叔狂磕mysql
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验