目录
5.一条sql发送给mysql后,内部是如何执行的?(说一下 MySQL 执行一条查询语句的内部执行过程?)
7.如果一张表创建了多个索引,在哪个阶段或模块进行的索引选择?
12.阿里、京东等大厂都有自研的存储引擎,如何开发一套自己的?
1.Mysql内部支持缓存查询吗?
当MySQL接收到客户端的查询SQL之后,仅仅只需要对其进行相应的权限验证之后,就会通过Query Cache来查找结果,甚至都不需要经过Optimizer模块进行执行计划的分析优化,更不需要发生任何存储引擎的交互
mysql5.7支持内部缓存,8.0之后就废弃掉了
2.MySQL8为何废弃掉查询缓存?
缓存的意义在于快速查询提升系统性能,可以灵活控制缓存的一致性
mysql缓存的限制
-
mysql基本没有手段灵活的管理缓存失效和生效,尤其对于频繁更新的表
-
SQL必须完全一致才会导致cache命中
-
为了节省内存空间,太大的result set不会被cache (< query_cache_limit);
-
MySQL缓存在分库分表环境下是不起作用的;
-
执行SQL里有触发器,自定义函数时,MySQL缓存也是不起作用的;
-
在表的结构或数据发生改变时,基于该表相关cache立即全部失效。
3.替代方案是什么?
应用层组织缓存,最简单的是使用redis,ehcached等
-
应用程序层面的缓存:在应用程序中实现缓存逻辑,可以更灵活地控制缓存的生命周期和内容。
-
使用第三方工具:例如ProxySQL,它可以作为中间件来缓存查询结果,并且支持缓存的TTL(生存时间),这样可以在一定程度上模拟查询缓存的功能。
-
服务器端查询重写:MySQL服务器提供了查询重写功能,可以通过重写查询来插入提示或进行其他修改以提高性能。
-
优化索引和查询:通过优化数据库的索引和查询逻辑来提升性能,减少对查询缓存的依赖。
-
使用其他数据库技术:如果查询缓存对应用程序非常关键,可以考虑使用其他支持查询缓存的数据库技术。
4.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。
key | 非key | key | 非key |
---|---|---|---|
SELECT | age | FROM |