《MySQL系列》之 常见面试题(六)

栏目:高等教育  时间:2023-03-28
手机版

  有字段为null索引是否会失效?

  不一定会失效,每一条sql具体有没有使用索引 可以通过trace追踪一下

  最好还是给上默认值

  数字类型的给0,字符串给个空串“”,

  Mysql内部支持缓存查询吗?

  当MySQL接收到客户端的查询SQL之后,仅仅只需要对其进行相应的权限验证之后,就会通过Query Cache来查找结果,甚至都不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生任何存储引擎的交互

  mysql5.7支持内部缓存,8.0之后就废弃掉了

  mysql8为何废弃掉查询缓存?

  缓存的意义在于快速查询提升系统性能,可以灵活控制缓存的一致性

  mysql缓存的限制

  mysql基本没有手段灵活的管理缓存失效和生效,尤其对于频繁更新的表

  SQL必须完全一致才会导致cache命中

  为了节省内存空间,太大的result set不会被cache (

  MySQL缓存在分库分表环境下是不起作用的;

  执行SQL里有触发器,自定义函数时,MySQL缓存也是不起作用的;

  在表的结构或数据发生改变时,基于该表相关cache立即全部失效。

  替代方案是什么?

  应用层组织缓存,最简单的是使用redis,ehcached等。

  Mysql内部有哪些核心模块组成,作用是什么?

  

  Connectors(客户端)

  MySQL服务器之外的客户端程序,与具体的语言相关,例如Java中的JDBC,图形用户界面SQLyog等。本质上都是在TCP连接上通过MySQL协议和MySQL服务器进行通信。

  MySQL Server(服务器)

  第1层:连接层

  系统(客户端)访问 MySQL 服务器前,做的第一件事就是建立 TCP 连接。

  经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证、权限获取。

  用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行

  用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限

  TCP 连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。

  第2层:服务层

  Management Serveices & Utilities:系统管理和控制工具

  SQL Interface:SQL接口:

  接收用户的SQL命令,并且返回用户需要查询的结果。比如SELECT ... FROM就是调用SQL Interface

  MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口

  Parser:解析器:

  在SQL命令传递到解析器的时候会被解析器验证和解析。解析器中SQL 语句进行语法分析、语法解析,并为其创建语法树。

  语法分析

  语法分析主要是把输入转化成若干个tokens,包含key和非key。

  在分析之后,会得到4个Token,其中有2个key,它们分别是SELECT、FROM。

  典型的解析树如下:

  

  Optimizer:查询优化器:

  SQL语句在语法解析后、查询前会使用查询优化器对查询进行优化,确定SQL语句的执行路径,生成一个执行计划。

  Caches & Buffers:查询缓存组件:

  MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、查询优化和执行的整个过程了,直接将结果反馈给客户端。

  这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等 。

  这个查询缓存可以在不同客户端之间共享 。

  第3层:引擎层

  插件式存储引擎层( Storage Engines),负责MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,管理的表有不同的存储结构,采用的存取算法也不同,这样我们可以根据自己的实际需要进行选取。例如MyISAM引擎和InnoDB引擎。

  存储层

  所有的数据、数据库、表的定义、表的每一行的内容、索引,都是存在文件系统 上,以文件的方式存在,并完成与存储引擎的交互。

  一条sql发送给mysql后,内部是如何执行的?(说一下 MySQL 执行一条查询语句的内部执行过程?)

  查询流程说明

  

  首先,MySQL客户端通过协议与MySQL服务器建连接,通过SQL接口发送SQL语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析。也就是说,在解析查询之前,服务器会先访问查询缓存,如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。

  接下来,MySQL解析器通过关键字将SQL语句进行解析,并生成一棵对应的解析树,解析器使用MySQL语法规则验证和解析SQL语句。例如,它将验证是否使用了错误的关键字,或者使用关键字的顺序是否正确,引号能否前后匹配等;预处理器则根据MySQL规则进一步检查解析树是否合法,例如,这里将检查数据表和数据列是否存在,还会解析名字和别名,看是否有歧义等。然后预处理器会进行查询重写,生成一棵新解析树。

  接下来,查询优化器将解析树转化成执行计划。MySQL优化程序会对我们的语句做一些优化,如子查询转换为连接、表达式简化等等。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引执行查询,以及表之间的连接顺序是啥样,等等。我们可以使用EXPLAIN语句来查看某个语句的执行计划。

  最后,进入执行器阶段。完成查询优化后,查询执行引擎会按照生成的执行计划调用存储引擎提供的接口执行SQL查询并将结果返回给客户端。在MySQL8以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存,再返回给客户端。

  历史文章及资料

上一篇:广州“领头羊”中山大学集体开班研修
下一篇:永州:江永县落实“四到位”“救”在身边

最近更新高等教育