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 647. Palindromic Substrings
    jquery--find与children方法的区别
    JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember
    javascript之原型prototype
    js的数据格式之json
    Javascript:必须知道的Javascript知识点之“单线程事件驱动”
    javascript自我测试题
    javascript:delete 删除对象的属性
    javascript:function 函数声明和函数表达式 详解
    [转]JavaScript可否多线程? 深入理解JavaScript定时机制
  • 原文地址:https://www.cnblogs.com/zhangbLearn/p/12096840.html
Copyright © 2011-2022 走看看