首页 > 数据库 >MySQL二、基础架构解析

MySQL二、基础架构解析

时间:2022-09-02 17:23:53浏览次数:63  
标签:语句 缓存 查询 索引 基础架构 MySQL 解析 连接

前言:

  1. 文章内容:MySQL基础架构、SQL成本计算
  2. 本文章内容来源于笔者学习笔记,内容可能与相关书籍内容重合
  3. 偏向于知识核心总结,非零基础学习文章,可用于知识的体系建立,核心内容复习,如有帮助,十分荣幸
  4. 相关文献:高性能MySQL、MySQL技术内幕InnoDB存储引擎、MySQL实战45讲

 

应用与MySQL服务器交互图:

 Server层功能和作用:

  连接器

  1. 负责跟客户端建立连接,获取权限,维持和管理连接。通过TCP握手建立连接后,连接器开始认证用户身份。
  2. 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,MySQL5.5之后,支持线程池插件,可以使用池中的少量线程来服务大量连接,不需要为每个新连接创建或销毁线程
  3. 连接建立过程比较复杂,应尽量减少连接的动作,使用长连接。由于MySQL在执行过程中临时使用的内存是管理在连接对象里的,这些资源在连接断开时才释放,长连接累积下来可能导致内存占用过大,被系统强行杀掉。

  查询缓存

  1. MySQL拿到一个查询请求后,会先查询缓存,之前是否有执行该条语句。有则查询缓存中的结果返回客户端,没有则查询DB并将结果存入查询缓存后返回客户端。
  2. MySQL8之后,查询缓存功能被删掉了,之前的版本可通过:query_cache_type=DEMAND来设置是否使用查询缓存,或显示的在查询时加上SQL_CACHE。
  3. 大部分情况下不建议使用查询缓存:

    • 对表的更新会导致该表上所有查询缓存被清空,对于频繁有更新的库,查询缓存命中率非常低。
    • 对于静态表,很长时间更新一次的表,可以适当采用查询缓存

  分析器/解析器

  1. 当没有命中查询缓存,就开始真正的执行语句。MySQL首先要知道语句要做什么,因此会对SQL进行解析,先词法分析然后语法分析。
  2. 在该阶段会判断语句是否正确,表是否存在,列是否存在等等。
    • 词法分析:分析语句中的字符串是什么,代表什么
    • 语法分析:分析语句中的语法规则是否满足MySQL语法

  优化器

  1. 语句分析完后,会进行优化器。作用是:重写查询、决定表的读取顺序、选择合适的索引。该过程结束后,这个语句的执行方案就确定了。
  2. 优化器不关心存储引擎,但存储引擎会影响优化器。优化器会请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。

  执行器

  1. MySQL通过分析器知道了语句要做什么,通过优化器知道了怎么做,之后进入执行器开始执行语句。
  2. 开始执行时会判断用户对该表有没有执行相应操作的权限。如果没有,则返回没有权限,如果有权限,则打开表继续执行。此时执行器会根据表的引擎定义,去使用这个引擎提供的接口

SQL语句成本计算:

  1. 优化器选择索引会考虑:扫描行数(行数越少代表磁盘访问次数越少,消耗CPU越少)、是否使用临时表、是否排序
  2. 扫描行数判断:根据索引字段的区分度来进行统计和估算,一个索引上不同值的个数叫基数,基数越大区分度越好
  3. 索引基数获取:默认选择N个数据页(N可以设置),统计这些页面上的不同值,得到一个平均值,乘以索引页面数,得到该索引基数。数据表会持续更新,当变更数据行数超过1/M(M可以设置)时,自动触发重新做索引统计。
  4. 得到预估扫描行数后,普通索引会考虑回表代价,排序,临时表等,索引选择出现异常时,可以force index强制指定索引,或通过sql优化、删除误用索引、新建更适合的所以,诱导优化器进行索引选择。

 

 

 

 

 

 

 

 

 

 

 

 

 

标签:语句,缓存,查询,索引,基础架构,MySQL,解析,连接
From: https://www.cnblogs.com/zhangbLearn/p/16650628.html

相关文章

  • mysqlbinlog 查看binlog时报错unknown variable 'default-character-set=utf8'【转】
    下午在排查MySQL主从同步问题时,想从主库的binlog中找一些线索,裸的binlog文件是无法直视的,mysqlbinlog这个工具是用来查看binlog文件内容的(使用方式manmysqlbinlog查看),但是......
  • Mysql压缩包版本安装
    之前一直使用的是安装包,今天懒得去下载了,直接用压缩包安装,记录一下。1、先去官网下载压缩包。https://dev.mysql.com/downloads/mysql/8.0.html2、将文件夹解压在要安装......
  • 尚硅谷mysql学习笔记
    查询去重SELECTDISTINCTdepartment_idFROMemployees;空值参数运算如果值为null则使用0替换,任何值与null计算都为nullSELECTemployee_id,salary"月工资",sal......
  • MySQL查询分析与优化
    一、关于EXPLAIN关键字段介绍:1.id代表sql中查询语句的序列号,序列号越大则执行的优先级越高,序号一样的依次执行。id为null则最后执行。2.select_type查询类型,表示当前被......
  • mysql查询数据库和数据表占用内存大小
    --查看所有数据库容量大小selecttable_schemaas'数据库',sum(table_rows)as'记录数',sum(truncate(data_length/1024/1024/1024,2))as'数据容量(GB)',sum(truncate......
  • window2012ServerR2 上安装mysql8遇到的问题
    安装教程:https://baijiahao.baidu.com/s?id=1734145282045952263&wfr=spider&for=pcwindow2012ServerR2上我在安装安装mysql8之前,最好把操作系统补丁打全,否则会遇到很多......
  • mysql 设置 update操作时自动更新时间字段
    建表CREATETABLE`time_update`(`id`int(10)unsignedNOTNULLDEFAULT'0',`name_seq`int(10)unsignedNOTNULLDEFAULT'0',`mod_time`timestampNOT......
  • MySQL教程 - 索引(Index)
    更新记录转载请注明出处。2022年9月2日发布。2022年9月2日从笔记迁移到博客。索引说明是一种对数据表的一列或多列进行排序的数据结构索引是单独的、存储在磁盘......
  • MySQL教程 - DQL操作
    更新记录转载请注明出处。2022年9月2日发布。2022年9月2日从笔记迁移到博客。基本查询SELECT属性列表FROM表或视图WHERE筛选条件1GROUPBY属性[HAVIN......
  • MySQL教程 - DML操作
    更新记录转载请注明出处。2022年9月2日发布。2022年9月2日从笔记迁移到博客。删除DELETEFROM表WHERE条件;清空TRUNCATETABLE表;DELETE和TRUNCATE对......