hincky的主页 hincky的主页
  • 学习笔记

    • Vue笔记
    • Vuepress
    • nginx
  • 语言类

    • java
    • go
    • python
    • 设计模式
  • 框架类

    • Spring
    • Spring Security
    • Mybatis
  • 容器技术

    • docker
    • k8s
    • helm
    • prometheus
    • grafana
    • jenkins
  • 命令集合

    • linux命令
    • docker命令
    • git命令
    • vim命令
    • k8s命令
  • 数据库

    • sql
    • mysql
  • 协议

    • 网络模型
    • http/1.1
    • WebSocket
    • http/2
    • TLS/SSL
    • tcp
    • IP
    • tcpdump抓包命令
    • wireshark抓包工具
  • 通用

    • Git
  • 技术分享

    • git push/pull总是超时怎么办
    • idea debug技巧
    • postman使用
    • 问题总结
    • idea使用技巧
  • Oauth2

    • Oauth2原理
  • 项目列表

    • redis项目
    • 微服务项目
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)

Hincky

当有趣的人,做想做的事
  • 学习笔记

    • Vue笔记
    • Vuepress
    • nginx
  • 语言类

    • java
    • go
    • python
    • 设计模式
  • 框架类

    • Spring
    • Spring Security
    • Mybatis
  • 容器技术

    • docker
    • k8s
    • helm
    • prometheus
    • grafana
    • jenkins
  • 命令集合

    • linux命令
    • docker命令
    • git命令
    • vim命令
    • k8s命令
  • 数据库

    • sql
    • mysql
  • 协议

    • 网络模型
    • http/1.1
    • WebSocket
    • http/2
    • TLS/SSL
    • tcp
    • IP
    • tcpdump抓包命令
    • wireshark抓包工具
  • 通用

    • Git
  • 技术分享

    • git push/pull总是超时怎么办
    • idea debug技巧
    • postman使用
    • 问题总结
    • idea使用技巧
  • Oauth2

    • Oauth2原理
  • 项目列表

    • redis项目
    • 微服务项目
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)
  • 数据库

    • sql

    • MySQL开发规范

    • mysql

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

    • kafka

  • 网络协议以及抓包工具

  • Git笔记

  • 技术分享

  • Oauth2

  • 计算机相关技术
  • 数据库
  • mysql
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)的时候,决定各个表的连接顺序

# 执行器

  • 判断执行权限
  • 如果有权限,就打开表继续执行
编辑 (opens new window)
#mysql
数据库三范式
更新语句如何执行

← 数据库三范式 更新语句如何执行→

最近更新
01
人生前期重要的能力
05-17
02
防火墙命令
04-11
03
docker-compose部署mysql主从集群
03-22
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Hincky | MIT License | 粤ICP备2022120427号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式