《一起学mysql》一、开篇

​ mysql作为一个开源的关系型数据库,融合了这个社会的缩影。

​ 我们在看护下成长或独自生根发芽、解决生活的烦恼,然后组成另一个家庭。也会在社会中由一席之地。


个体

家庭(数据库)中每个人都有着重要的任务:

连接器:连接器要管理链接,权限验证。

查询缓存:命中数据直接返回,但是听说老了退休了。

分析器:分析器词法分析,语法分析。

优化器:优化器确定最后的执行计划,并挑选出执行索引。

执行器:执行器操作存储引擎,返回操作结果。

他们就像一个工厂中的流水线工人,将客人(客户端)的订单(请求)顺序执行,然后放入机器(存储引擎)。


家庭

家庭(数据库)协作很重要,每个人都不可替代

  • 连接器

    第一步,用户会先和这个家庭建立联系,这个时候对外的是连接器连接器负责和用户建立联系,校验权限,维持和管理双方的联系。

    一般会写出这样一封信:

    mysql -h$ip -P$port -u$user -p
    

    当双方建立通信(TCP握手)后,连接器就会确认对方信息,如果发现不是授权用户,就会返回一个“Access denied for user”。

    连接器也会思考和用户的通信状态,比如确定自己是否是空闲的,如果空闲就竖起一个“sleep”的牌子,但是一旦休息超过8小时时(默认值),就主动断开和这个用户的通信。如果客户在断开后再次请求连接,就会收到一个“Lost connection to MySQL server during query。”的回信,告知通信已经断开。

    连接器一直在思考到底应该要和客户建立多久的连接才是合理的,他希望相对高效的完成自己的任务。如果一直不断开,那么就无法接待下一位客户,明显是不合理的;如果时间太短,会导致权限和连接浪费性能和时间。

    临时方案就是定期的断开大连接,这样消耗减少了很多。

    推陈出新的连接器在第5.7版本拿出了这样一个解决方式:每次在大操作(时间,空间)后,让连接初始化(释放内存),因为相互通信没有断,那么久可以不用建立连接和校验了。

  • 查询缓存

    建立完连接后,我们来到了第二部,访问查询缓存。

    每次建立连接完毕后,家里会在查询缓存老爷子这看看看。老爷子像一个门卫,之前登记过的信件和回信会登记在他的小笨笨上面。如果之前已经用相同的拜访者或者信件,老爷子就直接回信了。他认为放进去无在乎让他重新登记一次相同的数据,这样是很让费精力(性能)的。

但是在访问人数越来越多时,老爷子已经判断不了是否自己能够承接这个任务了,小本本越来越厚,改动越来越频繁。老爷子也到了要退休的年龄了。

到了8.0版本时,老爷子(查询缓存)退休了。

  • 分析器

    下一棒投递到了分析器,他就像一个摩斯密码的翻译者,将信件翻译成机器(存储引擎)认识的语言。

    分析器会将信件(任务)拆解为行为(select代表查询,update代表修改)。

    将执行内容转化为自己的工作语言(比如将 name = ‘’张三“,识别为等于张三的列name)。

    将重组后的语言进行赛选(语法分析),并判断是否有这些执行节点(表,字段),不合理的信件直接回信”You have an error in your SQL syntax“。

  • 优化器

    结束了分析器的工作,客户的寄信目的已经非常明确了,但是可能还是不够合理或者详细,这时候优化器就会代替客户在分析器翻译后的文章上用“更专业”的方式描述信件内容。

    他会判断客户的形容词(索引)是否准确,是否可以替换(优化),有多个形容词时,哪一个才是客户强调的重点,是否有客户忽略了的问题。

    他会分析客户叙述场景的方式(顺序),帮客户选出相对合理的执行流程(顺序)。

  • 执行器

    现在客户的需求已经非常明确了,并且已经拥有了明确的工作流执行文本,交给执行器的只剩执行了。

    执行器会判断客户是否有这个工作内容的执行节点的权限(表权限),如果权限不合理就会回信“ERROR 1142 (42000): *** command denied to user 'b'@'localhost' for table 'T'”

    判断完毕后,执行器会操作(调用)存储引擎,执行文本逻辑,并将执行结果写信寄出。

在家庭各成员紧密的配合下,每个成员成为了不可或缺的组成分子。

他们在明确的分工下完成自己的任务。

可能会有新的生命诞生,也会有退休的那一天。

你可能感兴趣的:(《一起学mysql》一、开篇)