mysql架构之select语句执行流程

流程图:

1.执行select语句

执行如下的sql语句,MySql数据库系统是如何来执行该sql语句的?

2.连接层

        当mysql服务器启动(mysql服务器就是一个进程),等待客户端连接,每一个客户的连接请求,服务器都会创建一个新的线程处理(如果是线程池的话,则是分配一个空的线程),每个线程都是独立的,拥有各自的内存处理空间。

        使用客户端(程序、客户端图形界面工具)访问mysql数据,第一步是连接上mysql的服务器。 

协议问题

连接所使用的协议。大多数是TCP协议,也可以使用其他的协议,例如:unix socket(了解即可)

连接问题

连接可以是长连接也可以是短连接,短连接的特点是连接后立即关闭,比较消耗资源。长连接使用后不会立即释放,可以给其他的客户端继续使用,所以mysql大多数都是使用的长连接。

同步问题

Mysql支持同步和异步的方式,大多数使用的是同步的方式,异步会给编程带来复杂性。

通过命令查看mysql服务器端连接相关的默认配置

show global status like 'Thread%';

连接在指定超时的时间后,会更新销毁。利用如下的命令可以查看。

-- 非交互式超时时间,例如:JDBC程序方式连接

show GLOBAL VARIABLES like 'wait_timeout';

-- 交互式超时时间,如客户端工具

show GLOBAL VARIABLES like 'interactive_timeout';

Mysql数据库默认支持的并发连接数量,默认值是151,是可以修改的。

-- 显示默认的最大并发连接数

show VARIABLES like 'max_connections';

通过查看mysql的官网也可以看到最大的连接数。

特别注意:

加了 Global  的命令是查看全局的参数,没有加是查看当前会话级别的参数。如果想设置全局的,需要修改mysql的配置文件。Linux系统下修改 /etc/my.cnf配置文件,windows下修改my.ini的配置文件。

3.缓存层

Mysql数据库中支持缓存,在5.7的版本中默认是关闭状态(在8的版本中已经去掉了mysql的缓存)。可以通过查看缓存相关的命令查看。

-- 查询mysql缓存

show VARIABLES like 'query_cache%';

        在mysql的配置文件my.ini或my.cnf中也可以找到缓存相关的配置,默认都是关闭的。

        query_cache_size=0

        以上信息是默认配置,其注释意思是说,MYSQL的查询缓存用于缓存select查询结果,并在下次接收到同样的查询请求时,不再执行实际查询处理而直接返回结果,有这样的查询缓存能提高查询的速度,使查询性能得到优化,前提条件是你有大量的相同或相似的查询,而很少改变表里的数据,否则没有必要使用此功能。Sql语句的更改(简单到修改了一个空格),都不会查询之前的缓存。表中完成了新增,修改数据缓存也会失效。

        如果想使用缓存,具体的配置方法:

        1.将query_cache_size设置为具体的大小,具体大小是多少取决于查询的实际情况,但最好设置为1024的倍数,参考值32M。

        2.增加一行:query_cache_type=1

        query_cache_type参数用于控制缓存的类型,注意这个值不能随便设置,必须设置为数字,可选项目以及说明如下:

        如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。

        如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。

        如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。

4.解析层

解析器解析编写的sql语句,根据关键字运算符等生成对应的树形结构。

词法和语法解析:

解析sql语句,生成树形结构。

语义解析:判断表名或者字段是否存在,使用的别名是否正确。

例如:select * from xxx  xxx表如果不存在,sql语句也会报错。

5.优化器

编写了一条sql语句,它是有多种执行路径的,只不过最终的执行结果是相同的。多种路径是由哪个组件来生成的,最终选择哪一个路径来执行该sql呢。

Mysql架构中使用优化器来根据解析树生成多条执行路径(执行计划),最终会选择一个执行计划去执行。

执行计划生成后,会选择优化器认为最优的执行计划进行执行。根据cost(成本)方式选择出来的优化器。

优化器还会对sql语句进行优化,例如在进行join多表查询的时候,哪张表先查,那张表后查询会进行优化,当一条sql执行可以使用几个索引,优化器也会选择出一个成本最优的索引使用。像sql语句中存在 1=1 的时候,也是可以把 1=1优化掉的。

如何去查看优化器生成的执行计划,加入explain去执行sql语句即可。

如果想查看更详细的信息,可以显示json的数据格式。

EXPLAIN FORMAT=JSON select * from t_person

6.执行器于存储引擎

        存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取。MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的。每一种存储引擎都有它的优势和劣势。

        可以使用 show engines; 命令来查看当前数据库所支持的所有的存储引擎。

举例:

        有的时候可能需要查询速度快,不需要持久化,基于内存的操作,那么可以使用memory引擎。

        有的数据是历史数据,基本上不会新增及其查询,提供压缩的功能就可以使用archive引擎。

        有的时候需要非常多的 读写,并发,数据一致性的操作,可以使用innodb引擎。

        查看mysql的官网,查看所有的mysql存储引擎。

创建表结构,可以选择不同的存储引擎。

CREATE TABLE `t_stu_memory` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=memory AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

7.总结

执行sql语句的流程总结

下图是mysql的系统架构图。

相关推荐

  1. MySQLSELECT语句执行流程详解

    2024-07-21 20:32:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 20:32:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 20:32:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 20:32:02       45 阅读
  4. Python语言-面向对象

    2024-07-21 20:32:02       55 阅读

热门阅读

  1. mysql索引篇

    2024-07-21 20:32:02       19 阅读
  2. FedAvg

    FedAvg

    2024-07-21 20:32:02      16 阅读
  3. 我在vue2重生之vite加强版

    2024-07-21 20:32:02       15 阅读
  4. 2024.7.20 暑期训练记录(6)

    2024-07-21 20:32:02       16 阅读
  5. 调用第三方接口-OkHttpClient

    2024-07-21 20:32:02       18 阅读
  6. C Prinmer Plus笔记第1-6章

    2024-07-21 20:32:02       17 阅读
  7. MySQL8的备份方案——差异备份(CentOS)

    2024-07-21 20:32:02       16 阅读
  8. C语言——数组指针

    2024-07-21 20:32:02       20 阅读
  9. 【Golang 面试基础题】每日 5 题(一)

    2024-07-21 20:32:02       20 阅读
  10. npm小记

    2024-07-21 20:32:02       16 阅读
  11. 【busybox记录】【shell指令】df

    2024-07-21 20:32:02       20 阅读
  12. C语言之封装,继承,多态

    2024-07-21 20:32:02       23 阅读
  13. 【广告&推荐】首选积分墙:试玩星shiwanxing.com

    2024-07-21 20:32:02       18 阅读
  14. 大模型的短期记忆和长期记忆各自的使用场景

    2024-07-21 20:32:02       20 阅读