转载 

当我们在聊 MySQL 的时候,是在聊哪些话题?

分类:    313人阅读    IT小君  2023-08-19 14:05

图片


如果我问你 Java 应用是怎么调数据库的,数据库是怎么执行的,你会怎么回答?


每个人都知道 InnoDB 是 MySQL 默认的存储引擎,那存储引擎是负责做什么的?


InnoDB 的工作原理是什么?你知道什么是 Buffer Pool,什么是 undo log、redo log、bin log 么?


MySQL 的数据是怎么存储的?什么是缓存页?什么是数据页?什么是行溢出?


MySQL 多个事务并发执行的场景是怎么样的?MySQL 怎么解决并发冲突?


什么是事务隔离机制、MVCC 多版本控制机制、锁?为什么要用它们?它们的底层实现原理是怎么样的?


索引是怎么一回事,为什么就要选择使用 B+ 树来做索引呢?用 B+树之后,查询和增删改在索引层面是怎么执行的?


为什么总说要避免回表,回表是什么,怎么避免回表?


聚簇索引、二级索引、联合索引等等,各种各样的索引是怎么一回事儿?


为什么有的时候索引会不生效?我们建立索引的时候有什么参考依据?有什么注意事项?索引要怎么优化?


怎么对 MySQL 进行压测?怎么监控它的性能?应该关注哪些指标?


除了上面这些基础问题,还有一些高阶问题:数据库怎么做备份和恢复?主从架构和读写分离、HA 高可用是怎么做的?分库分表又该怎么实现?


话题很多,一个个写。先从第一个问题开始:Java应用怎么调用 MySQL 的?MySQL 怎么执行一条 SQL 语句的。


图片


现在比如说有一条 SQL 语句 select name from user where id = 11; 要通过 Java 程序去查询,那会是怎么一个流程呢?


  1. 首先用户给后台发一个请求,我们会把程序部署在web容器里,一般来说就是 tomcat。

  2. Tomcat 做的事情就是监听端口号,把用户的请求都通过我们的程序来处理。

  3. Java 程序接到请求后,就是 controller -> server -> dao,dao 层则会去访问数据库。

  4. Java 程序和数据库通过什么连接?实际上就是通过数据库连接池,连接池里面会有很多的线程,dao 层发的请求就会交给数据库连接池中的某个线程来处理。

  5. 数据库连接池就连着 MySQL 数据库,它建立连接着时候是要校验用户名、密码等,完成一系列连接操作。此时就是和 MySQL 的连接器在打交道。

  6. MySQL 后台会启动监听线程,监听到程序给它发的请求,就要开始处理这条 SQL 了。


想象一下,现在我们要执行select name from user where id = 11;这样一个 SQL 语句,第一步会是什么?第一步是不是应该通过 where 后面的子句,把它这个查询条件先给用上?


MySQL 中有一个查询缓存,如果你开启了查询缓存,则之前执行过的语句和对应的结果,会以KV形式存储在缓存中。不过我们一般不会开启缓存,且 MySQL8 之后已经没有查询缓存这个功能。


高版本的 MySQL 没有查询缓存,或者说没有用到查询缓存,那就会直接用分析器(Parser)来分析 SQL 语句。分析器会对 SQL 进行词法分析,语法分析,简单来说就是解析 SQL 的一些关键词、表名、字段名什么的。比如说select name from user where id = 11;这个语句就会被解析成三部分:

  1. 我们要从 users 表里查询数据

  2. 查的数据是这个表里面 id = 11 的那一行

  3. 查出来的结果多的我不要,只需要 name 这字段


分析完之后,MySQL 会通过优化器(Optimizer)对语句进行优化,优化器做的事情就是找到最优的查询路径。什么叫最优的查询路径呢?简单来讲就是决定怎么查询最快。还是那条 SQL 语句,它可以有怎么样的查询路径?

  • 先找到 id = 11 的那一行数据,再把 name 字段筛选出来,这是一条路径。

  • 还可以怎么样?我先把所有数据的 name 字段查出来,再从这些结果里面找 id = 11 的。


优化器会生成一套执行计划,然后不停的调用存储引擎的各种接口去完成这些计划。MySQL 中的执行器就是专门负责调用存储引擎接口的。


跟着我,带你把 MySQL 的坑都填上!


转载于:http://mp.weixin.qq.com/s?__biz=MzI5MzQ2MDg4Nw==&mid=2247483778&idx=1&sn=b8818701f0575f049b3050fd798ce9a6&chksm=ec708f7adb07066c9f3f5f4477db8c0a0a3a5fefb45108780e5ff43318880c17aa1c49cbe9b5#rd

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

 工具推荐 更多»