zoukankan      html  css  js  c++  java
  • 1.MySQL基础架构

    好久没发博客了,终于又学完了一点知识并且进行了整理。就从这个MySQL系列开始继续坚持每个月产出几篇。

    声明一下,这次的MySQL系列是针对已有一定基础的小伙伴的,关于SQL的使用,一些概念的介绍就不再这里写了。


    首先我们来看一个简易的图片,学习MySQL的基础架构:

       MySQL的架构主体可分为: Server层和存储引擎层。Server层包括连接器、查询缓存、分析器、优化器、执行器。所有跨存储引擎的功能都在这一层实现。

    我们先介绍一下一个查询的语句,MySQL的执行流程:

    1. 应用服务器与数据库服务器建立一个连接
    2. 数据库进程拿到请求sql
    3. 解析并生成执行计划,执行
    4. 读取数据到内存并进行逻辑处理
    5. 通过步骤一的连接,发送结果到客户端
    6. 关掉连接,释放资源

    根据这个流程,我们来详细介绍每个组成的概念及意义。


     连接器:

      负责跟客户端建立连接,获取权限,维持和管理连接。通过TCP握手建立连接后,连接器开始认证用户身份。

      每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行。在MySQL5.5之后,支持线程池插件,可以使用池中少量的线程来服务大量的连接,不需要再为每个新连接创建或销毁线程。

    连接器验证方式:

      用户名+密码+原始主机信息

      使用SSL方式连接,还可以使用X.509证书认证

    验证结果及处理方式:

      验证失败,返回Access denied for user的错误,客户端程序结束执行。

      验证成功,连接器会在权限表中查出用户拥有的权限。之后,在这个连接里的权限判断都将依赖于此刻读到的权限。一次成功的连接中,即使管理员修改了用户权限,也不影响已经存在的连接的权限。

    补充:连接建立的过程比较复杂,应尽量减少连接的动作,使用长连接。注意:MySQL在执行过程中临时使用的内存是管理在连接对象里的,这些资源在连接断开时才释放,长连接累积下来可能导致内存占用过大,被系统强行杀掉。

    解决此种问题有两种常用方案:

      定期断开长连接,或程序里判断一个占用内存过大的查询后,断开连接再重连。

      MySQL5.7后,可以在每次执行一个较大的操作后,执行mysql_reset_connection来重新初始化连接资源。这个过程无需重连和权限校验,但是会将连接状态恢复到刚创建完的状态。


     查询缓存:

      MySQL拿到一个查询请求后,如果查询缓存打开,MySQL会优先检查这个查询是否命中缓存中的数据。

      该检查是通过一个大小写敏感的哈希查找实现。查询和缓存中的查询即使只有一个字节不同,也不会匹配缓存结果。如果命中了缓存,在返回结果前MySQL会检查一次用户权限,没问题则跳过其他阶段,直接从缓存中拿到结果并返回给客户端。没有则进行后续的逻辑,并从DB中拿到结果存入查询缓存后返回客户端。

     查询缓存的使用情况:

      对表的更新会导致该表上所有的查询缓存被清空,对于频繁更新的库,查询缓存的命中率很低

      对于静态表,很长时间更新一次的表,可以适当采用查询缓存。

    MySQL8之后,查询缓存功能被删掉了,之前的版本可以通过:query_cache_type=DEMAND,来设置是否使用查询缓存,或显示的在查询上使用SQL_CACHE

    SELECT SQL_CACHE * FROM dual

    查询优化处理:

      当没有命中查询缓存时就开始真正的执行语句了。在该阶段SQL语句会被转换为一个执行计划,MySQL依照这个执行计划和存储引擎进行交互。该过程包含了多个子阶段:解析SQL、预处理、优化SQL执行计划。我们分部来介绍:

    分析器:

      MySQL首先要知道语句要做什么,因此会对SQL进行解析,先词法分析然后语法分析。MySQL在这个阶段通过关键字将SQL语句进行解析,并生成一颗对应的解析树。在该阶段MySQL将会使用语法规则和解析查询。

      它要做的包含以下内容:

    •   验证是否使用错误的关键字
    •   使用关键字的顺序是否正确
    •   验证引号是否能前后正确匹配
    •        判断解析树是否合法:将检查数据表和数据列是否存在,还会解析名字和别名是否有歧义

    优化器:

      当分析器执行完后,现在语法树被认为是合法的了,优化器就会将其转换为一个执行计划。一条查询可以有很多执行方式,最后都返回相同结果。优化器的最主要作用就是找到其中最好的执行计划。

    关于查询优化阶段其他的详细内容,后序会有专门的文章进行介绍。


     执行器:

      MySQL通过分析器知道了语句要做什么,通过优化器知道了怎么做,之后进入执行器开始执行语句。

      开始执行时会判断用户对该表是否有相应操作的权限,如果没有,则返回没有权限。反之,打开表继续执行。此时执行器会根据表的引擎定义,去使用这个引擎提供的接口,然后获取结果返回客户端。


    参考文献:  

      高性能MySQL第三版

      MySQL实战45讲

  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/zhangbLearn/p/12096840.html
Copyright © 2011-2022 走看看