MySQL处理请求的整体结构

1:连接管理器:监听在TCP 3306端口上,接收请求

一般连接MySQL的四种类型:

  • DBA数据库管理员:通过管理工具如:phpadmin等
  • 应用程序:如php脚本等通过connector如:php-mysql
  • 程序员:通过API接口
  • 用户:通过MySQL语句

2:线程管理器:建立线程处理请求(mysql使用单进程多线程模型)

mysql进程对每个请求产生不同线程响应,采用线程复用(Thread Reuse)处理完请求后回收线程,用于处理后续请求

3:用户管理:用户层面的连接权限,用户是否有连接使用mysql的权限

4:命令分发模块:接收到命令后的预处理

  • 缓存模块:查看命令请求内容是否有缓存
  • 日志模块:记录命令日志
  • 解析器:缓存无相应内容后,传给解析器

5:解析器:解析命令类型,生成解析树,根据类型交付给相应管理模块

  • 优化器:针对select语句进行优化(对命令的执行方式进行优化,得出最佳执行方式)
  • 表修改模块:和表修改相关:如表创建、删除、更新、插入等操作
  • 表维护模块:表修复相关:检查、备份、恢复、优化(碎片整理)解析
  • 复制模块:主从复制相关
  • 状态报告模块:状态信息记录
  • 访问控制模块:对于上面的模块,用户是否有操作权限控制

6:表管理器:用户有相应操作权限后,对表的具体管理

  • 负责创建、读取、修改表结构定义文件

表结构也是数据,表结构定义文件专门存储表的结构(表大小,有哪些字段等等)和表数据是不同的文件

  • 维护表描述符高速缓冲

对表进行操作时需先知道库中有没有这张表, 需要将表的名称和定义缓存到内存中,查询时先看看有没有这个文件,再具体的通过存储引擎处理

  • 管理表锁

7:存储引擎:最后处理表和文件间的逻辑关系

用户查询请求过程:

当用户请求进来,连接管理通过连接管理器接收用户请求,为请求分配线程予以响应,线程通过线程管理器管理,使用线程重用,产生空闲线程,用户经过认证之后,建立安全连接;用户查询时,MySQL服务器在内部开始分析请求,在MySQL进程内部,创建解析树,并进行优化,选出最优执行路径(解析器和优化器作用),最后对一些特定结果做缓存。

优化器一些缺陷

优化器是程序自我智能判定的,可能某些环境下做出的优化并不是最佳的,所以可以手动指定

MySQL是插件式存储引擎,优化器不会考虑存储引擎不同,所以要给优化器提示的原因

时间: 2025-01-02 03:12:50

MySQL处理请求的整体结构的相关文章

MySQL EXPLAIN Output Format(MySQL运维神技)

摘要: DBA经常会用到的explain来查看SQL语句的执行计划,今天小人斗胆,从MySQL 5.7 Reference Manual中把MySQL EXPLAIN Output Format翻译过来.欢迎拍砖 Explain语句提供了一个select语句执行计划的信息. Explain为每个用了select语句的表,返回一行信息.它列出了表中的顺序输出,MySQL会读取他们,然后再处理.MySQL解决了所有使用嵌套循环连接方法.这意味着MySQL会读取第一个表中的一行,然后在第二个表中找到一

Jememeter和Loadrunner测试MySQL性能

From:http://blog.csdn.net/testingstar/article/details/60579454 MySQL数据库性能测试的方法 前置条件: 安装系统:windows 7 64 MySQL版本:mysql-installer-community-5.6.35.0 Java版本:jdk1.6.0_45 Jmeter版本:apache-jmeter-3.1 Mysql odbc驱动:mysql-connector-odbc-5.1.7-win32.msi Mysql jd

MySQL 性能优化---索引及优化

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持! 一.MySQL性能优化之-影响性能的因素 1.商业需求的影响 Myisam存储引擎内置一个计数器,count(*)时直接从计数器读取:而通过innodb存储引擎查找某个数据时,是必须扫描全表的,所以当执行对表的统计(即使用count(*)函数)时,myisam要比innodb要快的很多.所以一般在innodb上执行count(*)时一般要

10分钟学会理解和解决MySQL乱码问题

本文将详细介绍MySQL乱码的成因和具体的解决方案 MySQL出现乱码的原因 要了解为什么会出现乱码,我们就先要理解:从客户端发起请求,到MySQL存储数据,再到下次从表取回客户端的过程中,哪些环节会有编码/解码的行为.为了更好的解释这个过程,博主制作了两张流程图,分别对应存入和取出两个阶段. 存入MySQL经历的编码转换过程 上图中有3次编码/解码的过程(红色箭头).三个红色箭头分别对应:客户端编码,MySQL Server解码,Client编码向表编码的转换.其中Terminal可以是一个B

MySQL服务器性能优化

一:配置文件读取位置,不同系统my.cnf配置文件位置不同. 例如debian位置:/etc/mysql/my.cnf 找到mysqld二进制文件: find   /  -name  mysqld /usr/bin/mysqld   --verbose  --help  | grep  -A 1  "Default options" 二:全局缓存 (key_buffer_size(默认值:384M) innodb_buffer_pool_size innodb_additional_m

secilog 1.18 发布 增加了mysql审计,多个web报表等

日志分析软件 secilog 1.18发布,增加了mysql数据库审计,增加了多个web报表,对日志查询做了更多友好的新特性,上篇文章1.17,有兴趣可以了解一下.本次升级主要增加以下功能: 增加了mysql数据库审计 mysql的审计主要有几种方式,常用的是分析mysql的binlog功能,而binlog的分析一般不能实时分析,还有个问题就是binlog是二进制内容,需要借助第三方系统才可以分析.还有一种常用的方式是通过sniffer来分析mysql的请求,我们目前主要采用的是sniffer来

MySQL注入总结

SELECT first_name, last_name FROM users WHERE user_id = '$id' 1.id=1' or 1=1 --     这个可以查询所有的信息,其中“-- ”表示注释,它后面的内容将成为注释内容,注意:--后面要留有空格 注释符还有:# 和 /* 目录: 0x00 mysql一般注入(select) 0x01 mysql一般注入(insert.update) 0x02 mysql报错注入 0x03 mysql一般盲注 0x04 mysql时间盲注

MySQL日志文件

1)错误日志(error log) 错误日志对MySQL的启动.运行.关闭过程进行了记录. 通过show variables like 'log_error'来定位该文件. mysql> show variables like 'log_error'; +---------------+---------------------------------+ | Variable_name | Value | +---------------+----------------------------

通过MySql自动同步刷新redis

在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不适合使用Redis直接作为数据库.这俩家伙简直可以用“男女搭配,干活不累”来形容,搭配起来使用才能事半功倍.本篇我们就这两者如何合理搭配以及他们之间数据如何进行同步展开. 一般地,Redis可以用来作为MySQL的缓存层.为什么MySQL最好有缓存层呢?想象一下这样的场景:在一个多人在线的游戏里,排行榜.好友关系.队列等直接关系数据的情景