当前位置: 首页 > 科技观察

MySQL基础架构:SQL查询语句执行流程

时间:2023-03-12 08:32:19 科技观察

MySQL是一个采用层次结构的关系型数据库管理系统。本文将简要介绍MySQL数据库的内部架构。MySQL是一个C/S系统,MySQL服务器是服务端,连接到MySQL服务器的应用程序是客户端。MySQL架构主要包括三层:客户端层、服务器层、存储层、客户层、客户层。客户端层主要负责连接数据库。连接建立后,客户端可以看到一个线程。客户层向服务器发送请求命令并在屏幕上显示输出。例如连接MySQL服务器:mysql-uroot-p查询端口号3306:$netstat-ano|findstr3306TCP0.0.0.0:33060.0.0.0:0监听18456TCP0.0.0.0:330600.0.0.0:0监听18456TCP[::]:3306[::]:0监听18456TCP[::]:33060[::]:0侦听18456TCP[::1]:3306[::1]:64636已建立18456TCP[::]1]:64636[::1]:3306已建立148$tasklist|findstr18456mysqld.exe18456服务0374,900K$任务列表|findstr148mysql.exe148Console110,840K可以看到一个PID为148,名字为mysql.exe的进程。另外,打开一个连接会启动另一个mysql进程:$netstat-ano|findstr3306TCP[::1]:3306[::1]:64636已建立18456TCP[::1]:3306[::1]:64909已建立18456TCP[::1]:64636[::1]:3306ESTABLISHED148TCP[::1]:64909[::1]:3306ESTABLISHED1272Server层MySQLServer层负责MySQL的所有逻辑功能,包括连接数据缓存、缓存查询、分析器、优化器等核心功能,和执行器,以及所有内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,如存储过程、触发器、视图等.连接器客户端连接服务器时,首先会经过连接器。连接器负责与客户端建立连接,维护和管理连接,认证,权限管理等。执行连接命令mysql-uroot-p,输入密码,通过密码认证,然后进行权限认证,这样用户和MySQL服务器就成功建立了连接。您可以使用showprocesslist命令获取已建立的连接:mysql>showprocesslist;+----+----------------+----------------+-----+--------+-----+----------------------+----------------+|Id|User|Host|db|Command|Time|State|Info|+----+---------------+----------------+-----+---------+------+------------------------+-----------------+|4|事件调度器|本地主机|空|守护进程|6007|等待空队列|空||11|根|本地主机:64636|空|查询|0|开始|显示进程列表||12|根|64909|空|睡觉|5182||空|+----+------------+----------------+------+--------+--------+-------------------------+------------------+3rowsinset(0.00sec)连接建立成功后,如果没有进一步的操作,不会立即断开连接,连接会进入idle状态,Sleep代表空闲联系。这个空闲连接不会一直存在。一般默认为8小时,可以通过设置参数wait_timeout来控制。mysql>showglobalvariableslike'wait_timeout';+----------------+--------+|变量名|价值|+------------------+--------+|等待超时|28800|+----------------+--------+1行在集合中,1个警告(0.05秒)mysql>setglobalwait_timeout=28800;查询缓存在执行查询语句之前,MySQL会先搜索查询缓存,如果缓存中存在当前查询(语句和结果会以键值对的形式保存),则将结果直接返回给客户端.如果该语句不在查询缓存中,则继续执行后续阶段。执行完成后,执行结果会保存在查询缓存中。需要注意的是,对于频繁更新的数据表,不建议开启查询缓存。只要有一张表的更新,这张表上的所有查询缓存都会被清除,这对于高并发的服务会造成额外的开销,降低效率。MySQL8.0版本移除了查询缓存功能。mysql>showvariableslike'%query_cache%';+----------------+--------+|变量名|值|+-------------------+------+|有_query_cache|NO|+----------------+-------+1rowinset,1warning(0.00sec)AnalyzerAnalyzer是解析SQL语句.首先,它进行“词法分析”以识别SQL语句的字符串是什么以及它们代表什么。例如查询语句select*fromstudentwhereid=1;识别出关键字select代表一条查询语句,一张名为student的表,将字符串“id”识别为表字段id。如果id字段不存在,这个阶段会报错。词法分析完成后,开始“句法分析”,根据语法规则判断输入的SQL语句是否满足MySQL语法。优化器通过分析器后,同样使用优化器进行优化。它包括多种优化技术,例如确定扫描表的顺序、选择索引以及确定表连接的顺序。执行者SQL语句经过词法分析、语法分析、优化后,正式进入执行者阶段,开始执行语句。执行前还要进行权限校验,检查是否有对应的权限。如果授权,执行器将调用表引擎提供的接口执行语句,执行器返回一个由所有满足条件的行组成的记录集作为结果集返回给客户端。存储层存储引擎层负责数据的存储和提取。其架构模式为插件式,支持InnoDB、MyISAM、Memory等多种存储引擎。不同的存储引擎共享一个服务器层。使用命令显示引擎;查看当前MySQL服务器支持的引擎:mysql>showengines;+--------------------+--------+------------------------------------------------------------+------------+-----+------------+|发动机|支持|评论|交易|XA|保存点|+--------------------+--------+-------------------------------------------------------------+------------+------+------------+|内存|是|基于哈希,存储在内存中,对临时表很有用|否|否|否||MRG_MYISAM|是|相同MyISAM表的集合|否|否|否||格式|是|CSV存储引擎|否|否|否||联合|否|联邦MySQL存储引擎|无效的|空|空||性能_SCHEMA|是|性能架构|否|否|否||我的ISAM|是|MyISAM存储引擎|否|否|否||数据库|默认||是|是|是||黑洞|是|/dev/null存储引擎(你写入的任何内容都会消失)|否|否|否||存档|是|归档存储引擎|否|否|否|+-------------------+--------+----------------------------------------------------------------+-------------+------+------------+9rowsinset(0.00sec)默认存储引擎是InnoDB,它建表时可以使用指定存储引擎:createtablestudent(idintnotnullauto_incrementprimarykeyCOMMENT'ID',namevarchar(10)notnullCOMMENT'name',sexchar(10)notnullCOMMENT'gender',agetinyint(100)notnullCOMMENT'age',deptchar(4)notnullCOMMENT'profession')ENGINE=InnoDBDEFAULTCHARSET=utf8ROW_FORMAT=DYNAMICcomment='Student';MySQL5.5.5默认使用MyISAM存储引擎,MySQL5.5.5使用InnoDB作为默认存储引擎