重庆网站排名优化,目前旅游网站开发,设计师网课,网络问卷调查怎么制作分析SQL语句执行流程中遇到的问题 前言1 MySQL是怎么在一台服务器上启动的2 MySQL主库和从库是同时启动保持Alive的吗#xff1f;3 如果不是主从怎么在启动的时候保证数据一致性4 ACID原则在MySQL上的体现5 数据在MySQL是通过什么DTO实现的6 客户端怎么与MySQL Server建立连接… 分析SQL语句执行流程中遇到的问题 前言1 MySQL是怎么在一台服务器上启动的2 MySQL主库和从库是同时启动保持Alive的吗3 如果不是主从怎么在启动的时候保证数据一致性4 ACID原则在MySQL上的体现5 数据在MySQL是通过什么DTO实现的6 客户端怎么与MySQL Server建立连接有哪些建立连接的方式默认是什么可以选什么有哪些应用场景7.SQL组件接受的SQL是什么形式为什么单一一条SQL不做任何处理就被MySQL认为是一个事务8.查询后的结果是由哪个组件以什么形式返回9.解析器是怎么解析的解析器会调用API吗10.优化器是怎么优化的会调用API吗11.SQL报错机制会在哪些区域出现以什么形式发给客户端以什么形式写到哪个日志中12.执行器本质上是什么13 MySQL内部有哪些线程怎么分类14 MySQL进程包含哪些内容15 执行器会将sql提交给引擎还是调用引擎又是怎么调用的16 buffer pool区域中的数据页有多少以什么结构存储脏页呢17 buffer pool 中的数据页怎么更新的淘汰后的数据页由谁清理18 后台线程对脏页刷盘是怎么实现的19 sql语句中加锁在哪个部分实现的20 事务在engine中怎么实现21 MVCC怎么实现22 redolog分为哪几块内容有什么作用23 binlog呢24 undolog 呢25 数据写磁盘怎么实现的怎么传输的怎么保证一致性的26 主从数据一致性会保证内存数据一致吗27 MySQL断开连接可以从线程和客户端区分吗28 MySQL进程结束会执行哪些持久化操作 前言
面试想要过关斩将你就必须扪心自问问得越多问的越细才能披荆斩棘。盔甲若是漏洞百出不被戳死才怪。
下列问题为作者提出回答搜集而来。 由于作者并没有系统化从零开始学习MySQL所以可能某些非常基础的问题并不了解。
欢迎读者留言比较重要的基础wink
1 MySQL是怎么在一台服务器上启动的
MySQL通过配置文件my.cnf my.ini 来指定各种参数如端口号、数据目录等。初始化数据库首次启动的时候MySQL需要初始化系统表这里指定的是系统表空间吗启动系统生成日志
2 MySQL主库和从库是同时启动保持Alive的吗
为了实现数据同步通过binlog并行复制维持数据一致性主库应该首先启动并正常运行然后从库再启动并连接到主库。
3 如果不是主从怎么在启动的时候保证数据一致性
如果不是主从库没法保证可以自己设置一些通信维护。 如果没有同时启动其实无所谓。保证数据一致性主从之间首先需要通信分为三类异步、同步、半同步。由于是主库写日志等待从库响应。所以主库到底等不等从库是一个影响性能的问题。异步-半同步-同步一致性会越来越高期望响应时间越来越长。那么这里的sql写日志都是事务写进去的吗一句话概括主库提交会写binlog会由一个dump线程监听binlog文件的变更如果有更新会推送更新时间到从库从库接收到事件后会拉取数据有一个IO线程将binlog传过来的数据写到自己的relaylog中慢慢消化。所以我们先更新的是事务语句至于执行则是慢慢来。5.6库级别并行复制5.7 Group Commit 级别 并行复制logical_clock 逻辑时钟复制Write Set复制
4 ACID原则在MySQL上的体现
A:MySQL使用BEGIN /COMMIT /ROLLBACK 来管理事务C通过约束和触发器确保数据库的状态始终符合预期I支持四种隔离级别读未提交读已提交可重复读串行化通过锁定机制和MVCC实现D一旦事务提交数据就会永久保存即使发生系统崩溃也不会丢失。MySQL使用重做日志 和 双写缓冲区来实现持久性
5 数据在MySQL是通过什么DTO实现的
6 客户端怎么与MySQL Server建立连接有哪些建立连接的方式默认是什么可以选什么有哪些应用场景
TCP IP 通过网络地址和端口连接到MySQL服务器适用于远程连接Unix Socket连接在本地Linux/Unix系统上可以通过Unix域套接字连接到MySQL服务器。这种方式比TCP IP更快因为它避免了网络层的开销
jdbc:mysql://database_name?socket/temp/mysql.sck命名管道仅适用于win 本地连接 共享内存另一种win特有的连接方法 默认使用TCP IP
7.SQL组件接受的SQL是什么形式为什么单一一条SQL不做任何处理就被MySQL认为是一个事务
MySQL接收到的SQL是标准的SQL语句通常以文本的形式发给服务层
在MySQL中默认情况下每条单独提交的SQL语句都被视为一个独立的事务。这是因为autocommit模式下每条语句执行完毕后会自动提交事务。如果autocommit被关闭需要显式的 使用 BEGIN 和 COMMIT 提交事务
8.查询后的结果是由哪个组件以什么形式返回
执行器也就是sql线程生成结果集通过网络协议返回给客户端
执行器执行查询并生成结果集 MYSQL_RES结构网络层将结果集打包成适当的格式如二进制或文本并通过连接通道返回给客户端。
typedef struct st_mysql_res
{
my_ulonglong row_count;
unsigned int field_count,current_field;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MYSQL_ROW row;
MYSQL_ROW current_row;
unsigned long *lengths;
MYSQL *handle;
my_bool eof;
}MYSQL_REStypedef struct st_mysql_rows
{struct st_mysql_rows *next; //列表的行MYSQL_ROW data;
} MYSQL_ROWS; //mysql的数据的链表节点。可见mysql的结果集是链表结构typedef struct st_mysql_data
{my_ulonglong rows;unsigned int fields;MYSQL_ROWS *data;MEM_ROOT alloc;
} MYSQL_DATA; // 数据集的结构typedef struct st_mysql_field
{char *name; // 列名称 char *table; //如果列是字段列表char *def; //默认值(由mysql_list_fields设置)enum enum_field_types type; //类型的字段。Se mysql_com。h的类型unsigned int length; //列的宽度unsigned int max_length; //选择集的最大宽度unsigned int flags; //Div标记集unsigned int decimals; //字段中的小数位数
} MYSQL_FIELD; //列信息的结构typedef struct st_used_mem //结构为once_alloc
{ struct st_used_mem *next; //下一个块使用unsigned int left; //记忆留在块unsigned int size; //块的大小
} USED_MEM; //内存结构typedef struct st_mem_root
{USED_MEM *free;USED_MEM *used;USED_MEM *pre_alloc;unsigned int min_malloc;unsigned int block_size;void (*error_handler)(void);
} MEM_ROOT; //内存结构可以看到MySQL是用C/C 开发的
9.解析器是怎么解析的解析器会调用API吗 词法分析将SQL语句分解为一个个token 语法分析tokens转换语法树 语义分析 解析器本身并不调用外部API但他可能会调用内部函数或者模块来完成某些任务例如 元数据访问访问系统表或缓存中的元数据以验证表和列的存在性。 权限检查调用权限管理模块确保用户有足够的权限执行该操作
10.优化器是怎么优化的会调用API吗
查询重写对查询初步重写以简化查询结构统计信息收集收集表的统计信息例如行数、索引选择性等用于生成最优执行计划。生成候选计划基于不同的访问路径如全表扫描、索引扫描生成多个候选执行计划生成策略选择最佳计划评估每个候选计划的成本评估算法选择成本最低的计划作为最终执行计划优化器内部统计信息模块获取表的统计信息包含什么代价模型计算成本 理论支持访问路径模块确定可用的访问路径索引、表扫描等
11.SQL报错机制会在哪些区域出现以什么形式发给客户端以什么形式写到哪个日志中
报错机制出现的区域
解析阶段SQL语法错误或未知表/列名优化阶段无法生成有效的执行计划执行阶段运行时错误如违反约束、超时等网络传输阶段连接断开或其他通信错误
发给客户端的形式
错误代码一个唯一的数字标识。错误消息详细的描述信息帮助理解错误原因。
{code:1054,message:Unknown column nonexistent_columnin field list
}写入日志的形式
错误日志记录所有严重的错误和警告默认位于/var/log/mysql/error.log 或安装目录下的data文件夹中。慢查询日志记录执行时间超过阈值的查询默认位于/var/log/mysql/slow-query.log
2025-02-27T11:41:23.123456Z 0 [ERROR] [MY-01054] Unknown column nonexistent_column in field list12.执行器本质上是什么
执行器是MySQL查询处理过程中实际执行查询计划的部分。它根据优化器生成的执行计划调用存储引擎接口来访问和修改数据。
执行器的主要职责
1.物理操作执行根据执行计划中的物理操作如表扫描、索引查找等执行相应的数据库操作。 2.数据获取与处理从存储引擎中获取数据并进行必要的过滤、排序、聚合等操作。 3.结果集生成将处理后的数据组织成结果集准备返回给客户端。
执行器的工作流程 1.初始化执行计划加载执行计划并准备执行环境。 2.执行物理操作按顺序执行各个物理操作步骤。 3.返回结果
13 MySQL内部有哪些线程怎么分类
1.主线程Main Thread
职责负责启动和管理其他的线程实例mysql进程的主线程
2.连接处理线程Connection Threads
职责处理客户端连接请求每个客户端连接对应一个独立的线程实例thd线程对象用于处理每个客户端连接
3.后台线程Background Threads
职责执行各种后台任务如日志刷新、数据页刷盘等。示例InnoDB缓冲池线程负责缓冲池管理和脏页刷盘。Binlog Dump线程监听binlog 发送给从库。Purge线程负责清理不再需要的undo日志
4.IO线程I/O Threads
职责处理与存储设备的IO操作示例Redo Log线程负责写入重做日志。 Binlog线程负责写入二进制日志。
5.事务处理线程Transaction Handing Threads
职责管理事务的开始、提交和回滚操作。示例事务管理线程负责协调事务的状态。
14 MySQL进程包含哪些内容
MySQL进程mysqld包含多个组件和模块主要分为以下几个部分 1.服务器核心 Server Core 存储引擎 Strorage Engines 3.缓存和缓冲区Caches and Buffers Buffer Pool用于缓存数据和索引数据。Query Cache缓存查询结果以提高查询效率读缓存已被移除 日志系统 Logging System Binlog用于主从复制和数据备份记录所有更改操作。Undo Log用于事务回滚记录事务的反向操作Redo Log用于崩溃恢复记录所有未提交的事务 网络层Network Layer 处理客户端连接、数据传输和协议解析。 安全管理Security Management 执行各种后台任务如日志刷新、数据页刷盘等。
15 执行器会将sql提交给引擎还是调用引擎又是怎么调用的
执行器会通过调用存储引擎的接口来执行具体的数据库操作
调用方式
接口调用执行器通过调用存储引擎提供的接口如InnoDB的API来执行具体的操作。物理操作执行根据优化器生成的执行计划执行器调用相应的存储引擎接口来访问和修改数据。
16 buffer pool区域中的数据页有多少以什么结构存储脏页呢
数据页数量
大小可配置Buffer Pool的大小可以通过配置文件中的innodb_buffer_pool_size参数设置默认值通常为系统内存的70%-80%。每页大小默认情况下每页大小为16KB。
存储结构
LRU链表Buffer Pool 使用LRULeast Recently Used链表来管理数据也。最近使用的页面位于链表前端较少使用的页面位于链表末端。Flush链表脏页已修改但尚未写入磁盘的页面会被放入Flush链表中等待刷盘
脏页
定义脏页是指已经被修改但还写回到磁盘的数据页。存储位置:脏页同样存储在Buffer Pool中并被标记为脏页。管理脏页通过Flush链表管理定期或在特定条件下如内存不足或打到一定阈值被刷回磁盘。
17 buffer pool 中的数据页怎么更新的淘汰后的数据页由谁清理
数据页更新
读取当前数据页当需要访问某个数据页时如果该页不在Buffer Pool中则从磁盘加载到Buffer Pool。修改数据页对数据页进行修改后将其标记为脏页。写回磁盘脏页会在适当的时候如内存不足或达到一定的阈值通过后台线程写回到磁盘。
淘汰后的数据页清理 LRU链表当Buffer Pool 满时使用LRU算法淘汰最近最少使用的页面 清理过程 如果被淘汰的页面是干净的未修改可以直接丢弃。如果被淘汰的页面是脏页则必须先将其写回磁盘通过Flush链表管理。
18 后台线程对脏页刷盘是怎么实现的
后台线程通过以下几种机制实现脏页的刷盘 1.定时刷盘
InnoDB自动刷新InnoDB会定期检查脏页的比例如果超过设定的阈值如innodb_max_dirty_pages_pct则触发自动刷新操作。
2.后台线程
Page Cleaner线程负责将脏页写回到磁盘。它会定期检查Flush链表中的脏页并将这些脏页回到磁盘。
3.事务提交
同步刷盘在某些情况下如事务提交为了保证数据一致性需要立即刷盘。此时会调用fsync函数确保数据已经写入磁盘。
4.内存压力
当Buffer Pool内存不足时会优先淘汰脏页并将其写回磁盘。
19 sql语句中加锁在哪个部分实现的
SQL语句的加锁操作主要在执行器和存储引擎中实现
1.解析阶段
解析器解析SQL语句识别出需要加锁的对象如表、行等
2.执行器
执行器根据解析结果在执行过程中调用存储引擎的加锁接口对相关对象加锁。
3.存储引擎
存储引擎实现具体的加锁机制。例如InnoDB支持行级锁共享锁排他锁和表级锁。
SELECT * FROM users WHERE id 1 FOR UPDATE;执行器在执行这条查询时会调用InnoDB的加锁接口对users表中id1的行加排它锁
20 事务在engine中怎么实现
事务在存储引擎中的实现主要包括以下几个方面
1.事务管理器
负责事务的生命周期包括开始、提交、回滚。
2.日志系统
Redo Log记录所有未提交的事务操作用于崩溃恢复。Undo Log记录事务的反向操作
3.并发控制
MVCC多版本并发控制支持高并发下的读写操作避免锁冲突锁机制提供行级锁和表级锁确保事务的隔离性。
4.持久化
双写缓冲区Doublewrite Buffer确保数据页在写入磁盘时的一致性。刷盘操作通过后台线程定期将脏页协会到磁盘里。
21 MVCC怎么实现
22 redolog分为哪几块内容有什么作用
23 binlog呢
24 undolog 呢
25 数据写磁盘怎么实现的怎么传输的怎么保证一致性的
26 主从数据一致性会保证内存数据一致吗
27 MySQL断开连接可以从线程和客户端区分吗
28 MySQL进程结束会执行哪些持久化操作