MySQL中的SQL是如何执行的

MySQL是典型的C/S架构,也就是Client/Server架构,服务器端程序使用的mysqld.整体的MySQL流程如下图所示:

MySQL是有三层组成:

  1. 连接层: 负责客户端与服务器端建立连接,客户端发送SQL至服务端;
  2. SQL层: 对SQL语句进行查询处理;
  3. 存储引擎层: 与数据库文件打交道,负责数据的存储和读取.

其中,SQL层与数据库文件的存储方式无关,我们来看下SQL层的架构:

  1. 查询缓存: Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段.格外注意的是,因为查询缓存往往效率不高,所以在MySQL8.0之后就抛弃了缓存.
  2. 解析器: 在解析器中对SQL语句进行语法分析和语义分析.
  3. 优化器: 在优化器中会确定SQL语句的执行路径,比如说是根据全表检索,还是根据索引来检索等.
  4. 执行器: 在执行前需要判断用户是否具备权限,如果具备权限就执行SQL查询并返回结果.在MySQL8.0以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存.

SQL语句在MySQL中的流程是: SQL语句 -> 缓存查询 -> 解析器 -> 优化器 -> 执行器.

说说存储引擎,MySQL的存储引擎采用了插件的方式,每个存储引擎都面向一种特定的数据库应用环境.同事MySQL还允许开发人员设置自己的存储引擎.下面列举常见的存储引擎:

  1. InnoDB存储引擎: 是MySQL5.5.8版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等.
  2. MyISAM存储引擎: 在MySQL5.5.8版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少.
  3. Memory存储引擎: 使用系统内存作为存储介质,以便得到更快的响应速度.不过如果mysqld进程崩溃,则会导致所有的数据丢失,因此只有当数据是临时数据的情况下才会使用Memory引擎.
  4. NDB存储引擎: 也叫做NDB Cluster存储引擎,主要用于MySQL cluster分布式集群环境,类似于Oracle的RAC集群.
  5. Archive存储引擎: 有很好的压缩机制,用于文件归档,在请求写入时会进行压缩,所以经常用来做仓库.

注意,数据库的设计在于表的设计,所以MySQL中每个表的设计都可以采用不同的存储引擎,可以根据实际情况的数据处理需要来选择存储引擎,这个是MySQL强大的地方.

数据库管理系统也是一种软件

完成的MySQL结构图如下:

profiling的使用,开启profiling可以让MySQL收集在SQL执行时所使用的资源情况,命令如下

select @@profiliong;

返回结果如果是0表示关闭,如果是1表示打开.可以使用 set profiling = 1;将profiling打开.

接下来可以执行sql语句,然后使用 show profiles来查询当前会话产生的所有peofiles.

前面会有query_id,可以使用show profile;获取上次查询执行的时间,或者使用show profile for query id;查询指定的query id执行的时间.

当然还有oracle的执行过程,这个暂时不研究.

最新文章

  1. JavaScript中经典方法
  2. ueditor1.4.3 php版本使用修改图片上传路径
  3. 【Todo】pthread_key_t 和 pthread_once_t学习
  4. 你了解JS执行过程吗?
  5. ubuntu phone/touch的源码从哪里下载?
  6. ubuntu 软件安装配置使用总结(由xmind:Depends:java8-runtime but is not installed引出)
  7. 翻译Algorithms Unlocked
  8. ubuntu14.04安装ssh和ftp
  9. APP界面设计 大概总结
  10. jdk环境配置以及java执行过程
  11. Vue.filter 过滤器
  12. 如何让ajax执行完后再继续往下执行
  13. 非递归和递归分别实现求第n个斐波那契数。
  14. 定时任务Job
  15. e770. 确定按钮租中已选的单选按钮
  16. centos7.2 源码编译安装php7.2.4 apache2.4.37 https证书安装
  17. OptionParser模块学习
  18. Python 之网络编程
  19. android service笔记
  20. Oracle创建DataBase Links

热门文章

  1. [20190510]rman备份的疑问8.txt
  2. 利用python去实现数学基本值的计算
  3. zsh: command not found: 解决方法
  4. Mysql—存储引擎详解
  5. liteos MMU(十八)
  6. RSA 登陆加密与解密
  7. AtCoder - 2282 (思维+构造)
  8. [C1] Andrew Ng - AI For Everyone
  9. 创建testng.xml文件
  10. 剑指Offer-2.替换空格(C++/Java)