hincky的主页 hincky的主页
  • 2023

    • nginx
    • prometheus
    • 小工具
    • 部署
  • 数据库

    • MySQL是怎么使用/运行的
    • Redis核心技术与实战
  • 极客时间

    • Web协议详解与抓包实战
    • SQL必知必会
    • MySQL45讲
个人日常
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)

Hincky

当有趣的人,做想做的事
  • 2023

    • nginx
    • prometheus
    • 小工具
    • 部署
  • 数据库

    • MySQL是怎么使用/运行的
    • Redis核心技术与实战
  • 极客时间

    • Web协议详解与抓包实战
    • SQL必知必会
    • MySQL45讲
个人日常
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)
  • 编程语言

  • 数据库

  • 极客时间

    • Web协议详解与抓包实战

    • GO语言第一课

    • MySQL45

      • 查询语句如何执行
        • 连接器
          • 连接问题
        • 查询缓存
        • 分析器
          • 词法分析
          • 语法分析
        • 优化器
        • 执行器
        • 本篇命令
      • 更新语句如何执行
        • redo log
          • crash-safe
          • redo log特点
        • binlog
          • binlog特点
        • 数据恢复过程
          • 两段提交
          • 先redo后bin
          • 先bin后redo
        • 总结
          • 预防mysql异常重启
          • 如何选择备份周期
      • 事务隔离
        • 隔离级别
          • 读提交 和 可重复读
          • 不同隔离级别 视图创建差异
          • Oracle迁移事项
          • 可重复度的场景
        • 事务隔离的实现
          • 如何避免长事务
        • 事务启动方式
      • 索引入门
        • 常见索引模型
          • 哈希KV表
          • 有序数组
          • 搜索树
          • 数据库常用N叉树
        • InnoDB索引模型-B+树
          • 主键索引和普通索引区别
    • SQL必知必会

    • Linux性能优化实战

  • 读书笔记
  • 极客时间
  • MySQL45
hincky
2022-11-09
目录

查询语句如何执行

如图,MySQL 可以分为 Server 层和存储引擎层两部分:

server层:

  • 连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能
  • 以及所有的内置函数(如日期、时间、数学和加密函数等)
  • 所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等

存储引擎层:

  • 负责数据的存储和提取。 其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。

现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

  1. InnoDB 存储引擎:它是 MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。
  2. MyISAM 存储引擎:在 MySQL 5.5 版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少。
  3. Memory 存储引擎:使用系统内存作为存储介质,以便得到更快的响应速度。不过如果 mysqld 进程崩溃,则会导致所有的数据丢失,因此我们只有当数据是临时的情况下才使用 Memory 存储引擎。
  4. NDB 存储引擎:也叫做 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群环境,类似于 Oracle 的 RAC 集群。
  5. Archive 存储引擎:它有很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以也经常用来做仓库。

# 连接器

  • 利用tcp完成与服务端的连接,校验用户名和密码

  • 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限

利用show processlist查看连接的状态

默认8小时后自动断开连接

# 连接问题

为了减少建立连接的动作,尽量使用长连接。

mysql由内存管理连接对象,长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),比如 MySQL 异常重启了

解决方法:

  1. 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
  2. 如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

# 查询缓存

MySQL 8.0 版本直接将查询缓存的整块功能删掉了

将之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。

再次查询,如果命中缓存,就直接返回结果,效率高

警告

只要有对一个表的更新,这个表上所有的查询缓存都会被清空

query_cache_type设置成DEMAND,使默认的 SQL 语句都不使用查询缓存

用 SQL_CACHE 显式指定使用查询缓存

select SQL_CACHE * from T where ID=10;
1

# 分析器

# 词法分析

T”识别成“表名 T”,把字符串“ID”识别成“列 ID”

比如:如果表 T 中没有字段 k,会在这一阶段报错

# 语法分析

判断你输入的这个 SQL 语句是否满足 MySQL 语法

如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒

# 优化器

  • 在表里面有多个索引的时候,决定使用哪个索引;
  • 或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序

# 执行器

  • 判断执行权限
  • 如果有权限,就打开表继续执行

# 本篇命令

# 建立连接后,查看连接的状态
show processlist

# 用 SQL_CACHE 显式指定使用查询缓存
select SQL_CACHE * from T where ID=10;

1
2
3
4
5
6
编辑 (opens new window)
#mysql
HTTP请求的典型场景
更新语句如何执行

← HTTP请求的典型场景 更新语句如何执行→

最近更新
01
集成chatgpt的工具
05-24
02
修改服务器ssh默认连接端口
05-22
03
阿里云免费证书
05-15
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Hincky | MIT License | 粤ICP备2022120427号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式