Mysql基础知识

Mysql基础

1.Mysql的基本架构 未命中 ------>优化器--------->执行器---->引擎
客户端—>连接器—>查询缓存—>
命中缓存----->返回结果

2.连接器是啥
我们要进行查询 第一步就是先去连接数据库 这个时候就是连接器和我们对接
负责跟客户端建立连接 获取权限 维持 和管理连接
连接的时候会经过TCP握手 然后身份 验证 验证OK后 就连上了Mysql服务了

3.怎么查看空闲连接列表
show processlist
需要注意的是 数据库的客户端太久没响应 连接器就会自动断开了 这个时间参数是wait_timeout控制的 默认时长是8小时

4.长连接
其实长连接是相对于通常的短链接来说的 也就是长时间保持客户端与服务端的连接状态
缺点:使用长连接之后 内存会飙升 如果一致使用长连接 那就回导致OOM out of memory
会导致mysql重启 在JVM里面就会导致频繁的 full GC

5.怎么解决长连接的缺点
一般会定期断开长连接,使用一段时间后 或者程序里面判断执行过一个占用内存比较大的查询后就断开连接 需要的时候重连
或者:执行比较大的一个查询后 执行mysql_reset_connection可以初始化连接资源 这个过程相比上面一种会好点不需要重连 但是会初始化连接的状态

6.你连接mysql的查询缓存么?
Mysql拿到一个查询请求后 会先到查询缓存看看 之前是不是执行过这条语句
同一条语句在mysql执行两次 第一次和后面的时间是不一样的后者明显快一些 这是因为缓存的存在
跟redis一样 只要是你之前执行过的语句 都会在内存里面用key-value形式存储这
查询的时候就会拿着语句先去缓存中查询 如果能够命中就返回缓存的value 如果不命中就执行后面的

7.缓存弊大于利
缓存的失效很容易 只要对表有任何的更新 这个表的所有查询缓存就会全部被清空 就会出现缓存还没使用 就直接被清空了 或者积累了很多缓存准备使用 但是一个更新打回原形
所以 只有那种只查询不更新的表适用缓存 但是这样的表往往很少存在 一般嘛都是配置表之类的
缓存在mysql8.0之后就取消了

8.缓存查询完了做啥
在缓存没有命中的情况下 就开始执行语句了 你写的语句有没有语法错误 这是接下来mysql比较关心的点
Mysql会先做词法分析 然后开始语法分析 分析没错之后就进入下一步 优化器

9.优化器
优化就比较简单了 因为我们建立表可能会建立很多索引优化有一部就是要确认使用哪个索引,比如使用你的主键索引 联合索引还是什么索引更好
还有就是对执行顺序进行优化 调减那么多 先查哪个表 还是先关联 会出现很多方案 最后由优化器决定选用哪种方案

10.执行器
优化之后就是执行
执行的时候 就一行一行的判断是否满足条件
数据库的慢日志有个rows_examied字段 扫描多少航可以看到 还有explain也可以看到执行计划
可以看到我们扫描了多少行

11.explain简介
explain命令时查看优化器如何决定执行查询的主要方法 使用explain 只需要在查询中的select关键字之前增加explain这个词即可 mysql会在查询上设置一个标记 当执行查询时 这个表标记会使其返回关于在执行计划中每一步的信息 而不是执行它 它会返回一行或多行信息 显示出执行计划中的每一部分和执行的次序 从而可以分析结果中找到查询语句或是表结构的性能瓶颈
explain;
1)分析出表的读取顺序
2)数据读取操作的操作类型
3)哪些索引可以使用
4)哪些索引被实际使用
5)表之间的引用
6)每张表有多少行被优化器查询

Mysql索引

1.索引有哪些结构
Hash B+

2.为什么哈希表、完全平衡二叉树、B树、B+树都可以优化查询 为何mysql独独喜欢B+树?
1)hash: 如select *from A where date>xxx
hash表的特点是可以快速的精确查询 但是不支持范围查询
如果做成索引 那速度有屙屎很慢的 需要全部扫描

2)hash在哪些尝尽比较适合?
等值查询的场景 只有Key value的情况 如redis Memcached等这些nosql的中间件

3)有没有有序的数据结构?
有序数组,在等值查询和范围查询的时候都很Nice 缺点是 有序的适合静态数据
因为如果我们新增、修改、删除数据的时候就会改变他的结构
有序数组适用地方 可以用来做静态存储引擎 用来保存静态数据 例如保存2019年的支付宝账单
淘宝购物记录等都是很合适的 都是不会变动的历史数据

4)二叉树
二叉树是有序的,所以是支持范围查询的
但是他的时间复杂度 是o(logN) 为了维持这个时间复杂度 更新的时间复杂度也得是,那就得保持这棵树是完全平衡二叉树了

5)怎么听你一说 平衡二叉树用来做索引还不错呢
此言差矣 素银也不只是在内存里面存储的 还是要落盘持久化的 如果数据多了 树高会很高 查询的成本就会随着树高的增加而增加

6)B树
可以发现同样的元素 B树的标识要比完全平衡二叉树要矮 原因在于B树的一个节点恶意存储多个元素
B树其实就已经是一个不错的数据结构 用来做索引效果还是不错的

7)B+树
B+树的表示要比B树胖 原因在于B+树的非叶子节点会冗余一份在叶子节点中 并且叶子节点之间用指针相连
B树一个节点可以存储多个元素现对于 完全平衡二叉树整体的树高降低了 磁盘IO效率提高了
而B+树是B树的升级版 知识把非叶子节点冗余一下 这样做的好处是为了提高范围查找的效率

B+树中一个节点为一页 或页的倍数最为合适,这样不会造成资源的浪费

3.回表
比如我们有个主键为ID的索引 和一个普通name字段的索引
如果我们查询select *from table where name=‘张三’
执行的流程是先查询到Name索引上的张三 然后找到他的id是2 最后去主键索引 找到id为2对应的值
回到主键索引树搜索的过程 就是回表 不过也有方法避免 回表 那就是覆盖索引

4.覆盖索引
比如刚才是select * 查询所有的 ,我们如果只查询id 其实name字段的索引上就已经有了 那就不需要回表了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值