首页 > 数据库 >【MySQL】2-深入理解MySQL体系认识及SQL的执行

【MySQL】2-深入理解MySQL体系认识及SQL的执行

时间:2023-05-24 15:01:03浏览次数:48  
标签:存储 缓存 MySQL 索引 深入 SQL 执行



文章目录

  • MySQL体系认识及SQL的执行
  • MySQL体系结构
  • client connectors
  • Connection Pool
  • SQL Interface
  • Parser
  • Optimizer
  • 文件系统
  • Cache
  • 工作原理
  • 缓存配置
  • 限制条件
  • 各存储引擎
  • CSV引擎【表格存储】
  • Archive存储引擎【压缩协议】
  • Memory存储引擎【存储内存中、热点数据】
  • Myisam【8.0淡出了历史舞台】
  • Innodb
  • SQL执行过程
  • 执行计划
  • 查看执行计划
  • 深入理解执行计划
  • 执行计划-id【SQL执行的顺序】
  • 执行计划-select_type【执行类型】
  • 执行计划-Table【数据表】
  • 执行计划-type
  • partitions【分区信息】
  • possible key【可能用到的索引】
  • key【真正用到的索引】
  • 执行计划-key_len【索引的长度】
  • rows
  • filtered
  • 数据返回


MySQL体系认识及SQL的执行

MySQL体系结构

【MySQL】2-深入理解MySQL体系认识及SQL的执行_mysql

client connectors

  • 各个语言连接数据库的方式
  • 如:JDBC、ODBC、.NET

Connection Pool

  • 整个接入的连接池
  • 连接的处理、安全和用户名的管控、线程的处理

SQL Interface

  • SQL 语句的入门,负责接收用户的 SQL 语句,返回结果

Parser

  • 进行词法和语法的分析,解析成MySQL能够识别的语法

Optimizer

  • 查询优化器,用来查询优化的,执行最优的执行计划
  • 找到执行SQL语句的最优执行计划
  • 物理优化、逻辑优化

文件系统

  • 数据落盘
  • 日志

Cache

  • 负责存储MySQL查询的索引

工作原理

将SQL语句以及执行的结果做为K-V键值对缓存在caches模块中,后续基于接收的SQL语句,先去查询缓存,判断是否存在可用的记录集

缓存配置

  • query_cache_type 设置我似查询缓存开关
  • query_cache_size
  • query_cache_limit

限制条件

  • 缓存失效与表数据是一致的,表数据发生任何改动都将让缓存失效
  • 需要手工开启,在MySQL5.6以后默认关闭了查询缓存功能
  • 判断条件苛刻,SQL语句必须完全一致
  • 多个空格也不可以
  • 将传进来的语句作为Key,每次必须要和Key相等才可以
  • 带来额外的性能消耗,数据的返回过程中若开启了缓存需先缓存SQL和结果

【MySQL】2-深入理解MySQL体系认识及SQL的执行_数据_02

各存储引擎

  • 存储引擎用于修饰表,一个表只能有一个存储引擎
  • 默认的存储引擎 Innodb
  • 存储引擎是插拔式的,可以随时进行加载和卸载

CSV引擎【表格存储】

特点

  • 不能定义索引、列定义必须定义NOT NULL、不能设置自增列
  • CSV表的数据的存储格式用 “,” 隔开,可直接编辑文件进行数据的编排
  • 数据安全性低
    应用场景
  • 不适用大表和数据的在线处理
  • 数据的快速导入导出
  • 表格直接转换成CSV

Archive存储引擎【压缩协议】

特点

  • 压缩协议进行数据的压缩,占用磁盘的空间少
  • 只支持 insert 和 select 两种操作
  • 只允许自增ID列建立索引

应用场景

  • 数据备份系统(日志系统、文档归档)
  • 大量设备高频的数据采集

Memory存储引擎【存储内存中、热点数据】

特点

  • 数据都是存储在内存中,处理效率高,表大小限定默认16M
  • 不支持大数据存储类型的字段如 blog、text varchar(n)【可变的】 – > char(n)【不可变的】
  • 支持Hash索引,等值查询效率高
  • 数据的可靠性低,重启或系统崩溃时数据丢失

应用场景

  • 热点数据快速加载(功能类似缓存中间件)
  • MySQL临时表存储(查询结果于内存中计算数据)

Myisam【8.0淡出了历史舞台】

特点

  • 较快的数据插入和读取性能
  • 数据存储既有较小的磁盘空间占用
  • 支持表级别的锁,不支持事务
  • 数据文件与索引文件分开存储,无主键索引之分

应用场景

  • 只读应用或者以读为主的业务

Innodb

特点

  • 支持事务【ACID : 原子性、隔离性、一致性、持久性】
  • 行级锁
  • 聚集索引【主键索引】
  • 外键支持,保证数据的完成性【带来额外的性能开销】

应用场景

  • 无脑选择

【MySQL】2-深入理解MySQL体系认识及SQL的执行_SQL_03

SQL执行过程

【MySQL】2-深入理解MySQL体系认识及SQL的执行_数据库_04


DQL语句的执行

  • 由我们的 SQL Interface 拦截到用户的 DQL 语句
  • 去我们的缓存中查看是否存在
  • 不存在,则进入我们解析器、优化器、执行器,最后交给我们的存储引擎

【MySQL】2-深入理解MySQL体系认识及SQL的执行_mysql_05


通讯阶段

  • 通讯协议:TCP/IP,Unix Socket
  • 通讯方式:长连接、半双工
  • 思考:若一个SQL语句发出去很久没有回应怎么办?【show processlist / kill 18(杀死某个端口)】

执行计划

查看执行计划

  • explain/desc SQL:查看生成的最优的执行计划
  • set global optimizer_trace=‘enable=on’:打开记录SQL的执行计划开关【以一个json记录至optimizer_trace】

深入理解执行计划

执行计划-id【SQL执行的顺序】

  • id 相同:执行顺序由上到下
  • id 不同:id 值越大的优先级越高,优先被执行

执行计划-select_type【执行类型】

  • Simlpe:简单查询
  • PRIMARY:最外层查询
  • SUBQUERY:子查询
  • UNION:连接查询
  • UNION RESULT:连接查询的结果集

执行计划-Table【数据表】

  • 查询涉及到的表或者表的别名

执行计划-type

SQL执行数据的获取方式
SQL执行优化中一个很重要的指标,评测SQL好坏最直观的参数

取值:

  • system
  • const:唯一性索引、常量比较
  • eq_ref:唯一性索引扫描
  • ref:普通索引扫描
  • range:基于索引的范围查找
  • index:full index scan【基于全量的一个扫描】
  • all:full all scan【基于全量的一个扫描】

partitions【分区信息】

possible key【可能用到的索引】

key【真正用到的索引】

执行计划-key_len【索引的长度】

  • 索引使用的包括列长度

rows

  • 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
  • 越少越好

filtered

  • 指返回结果的行占需要读取的行(rows)的百分比
  • 越大越好,扫描的数据的准确性越高

数据返回

  • 配置了MySQL的缓存机制,执行缓存操作
  • SQL执行返回结果以增量的返回方法进行返回
  • 开始生成第一条结果时,MySQL就开始往请求方逐步返回数据
  • MySQL服务器无须保存过多的数据,浪费内存
  • 用户体验好,若无须等待所有数据可将拿到的数据展示


标签:存储,缓存,MySQL,索引,深入,SQL,执行
From: https://blog.51cto.com/u_16127529/6340869

相关文章

  • mysql、sqlx
    1.导包goget-ugithub.com/go-sql-driver/mysqlimport_"github.com/go-sql-driver/mysql"_表示只执行包中init函数,mysql包会在init函数中注册自己。2.连接数据库利用基本库database/sql连接数据库1dsn:="root:123456@tcp(127.0.0.1:3306)/test_db"2db,err:=s......
  • MySQL8.0清空binlog
    环境centos7.9mysql Ver8.0.32登录MySQL,查看binlog日志#查看binlog日志开启状态,log_bin值为ON表示开启状态mysql>showvariableslike'log_bin';+---------------+-------+|Variable_name|Value|+---------------+-------+|log_bin|ON|+---------......
  • MySQL8.0配置my.cnf
    环境centos7.9因为是源码安装的MySQL8.0.32,查了一下MySQL8.0之后源码中不包含my.cnf文件和my-default.cnf文件了。手动创建一个my.cnf,放到默认目录/etc下,以后修改配置可以从my.cnf文件中修改,重启生效,相当于永久生效。文件内容:暂时先配这些,后期再扩展[client]port=3306soc......
  • 学习笔记-sql 篇
    groupbySELECTBIGINT(self_gds_id%10)item_group,CASEWHENBIGINT(self_gds_id%10)IN(0,3,4,5,6,9)THEN'人工定价'ELSE'算法定价'ENDtype--errorFROMjiuwu_sc.ads_spc_service_recycle_process_dsWHEREself_platform_on_shelf_time>......
  • 深入webflux-01-入门
    02reactivespring地位03webflux简介......
  • sql--每天两道sql题,天天健康好身体_第七天
    每天会在网上找两三道sql题练习练习,提高自己的sql语句的使用能力(先自己思考出答案,再和别人的答案做一下对比,然后深入思考一下)以下是四个表信息:问题1:查询004课程分数小于60,按照分数降序排列的同学学号答案1:selectsidfromgrade_table wherecid=004andscore<60order......
  • MySQL保证主备一致,如何解决循环复制?
    备库只读,是如何和主库同步数据的?你可能会问,我把备库设置成只读了,还怎么跟主库保持同步更新呢?这个问题,你不用担心。因为readonly设置对超级(super)权限用户是无效的,而用于同步更新的线程,就拥有超级权限。主备同步的详细流程?可以看到:主库接收到客户端的更新请求后,执行内部......
  • 动力节点Docker深入浅出(二)Docker引擎
    分享一下最近正在b站上看动力节点的docker课程,整理了相关学习笔记,会按照学习进度慢慢更新的,加油2Docker引擎2.1Docker引擎发展历程2.1.1首发版本架构Docker在首次发布时,其引擎由两个核心组件构成:LXC(LinuxContainer)与DockerDaemon。不过,该架构依赖于LXC,使得Docker存在......
  • 深入解析Docker(2)Docker引擎
    分享一下最近正在b站上看动力节点的docker课程,整理了相关学习笔记,会按照学习进度慢慢更新的,加油2Docker引擎2.1Docker引擎发展历程2.1.1首发版本架构Docker在首次发布时,其引擎由两个核心组件构成:LXC(LinuxContainer)与DockerDaemon。不过,该架构依赖于LXC,使得Docker存在严重的......
  • How to find the TLS used for the SQL Server connection
    本文是HowtofindtheTLSusedfortheSQLServerconnection这篇英语文章的翻译,此文出处请见于文章底部链接:原文出处[1]对于客户,我做了一些研究,如何找出SQLServer数据库会话连接使用了哪一种TLS协议。唯一的方式就是创建一个扩展事件,这个扩展事件有一个很大的限制就是只有......