Java 面试篇-MySQL 专题(如何定位慢查询、如何分析 SQL 语句、索引底层数据结构、什么是聚簇索引?什么是非聚簇索引?知道什么是回表查询?什么是覆盖索引?事务的特性、并发事务带来的问题?)

Java 面试篇-MySQL 专题(如何定位慢查询、如何分析 SQL 语句、索引底层数据结构、什么是聚簇索引?什么是非聚簇索引?知道什么是回表查询?什么是覆盖索引?事务的特性、并发事务带来的问题?)
🔥博客主页: 【小扳_-ZEEKLOG博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        1.0 MySQL 中,如何定位慢查询?

        2.0 发现了 SQL 语句执行很慢,如何分析呢?

        3.0 什么是索引?

        4.0 索引的底层数据结构了解过吗?

        5.0 B 树与 B+ 树的区别是什么呢?

        6.0 什么是聚簇索引?什么是非聚簇索引?

        7.0 知道什么是回表查询吗?

        8.0 知道什么是覆盖索引吗?

        9.0 MySQL 超大分页怎么处理?

        10.0 索引创建原则有哪些?

        11.0 什么情况下索引失效?

        12.0 SQL 的优先经验有哪些?

        13.0 创建表的时候,是如何优化的呢?

        14.0 在使用索引的时候,是如何优化呢?

        15.0 对 SQL 语句做了哪些优化呢?

        16.0 事务的特性是什么?可以详细说一下吗?

        17.0 并发事务带来哪些问题?

        18.0 怎么解决这些问题?MySQL 的默认隔离级别是?

        19.0 undo log 和 redo log 的区别是什么?

        20.0 事务中的隔离性是如何保证的呢?(解释一下 MVCC)

        21.0 MySQL 主从同步原理是什么?

        22.0 项目用过 MySQL 的分库分表吗?

        23.0 那你之前使用过水平分库吗?


        1.0 MySQL 中,如何定位慢查询?

        先是通过压力测试的时候,发现有些接口响应时间非常慢,查过了 2 秒。再接着通过部署运维监控系统 Skywalking,在它的报表展示中可以看到哪个接口慢,并且能分析出接口中哪部分耗时较多,包括具体的 SQL 执行时间,这样就能定位到出现问题的 SQL 。

        如何没有这种监控系统,MySQL 本身也提供了慢查询日志功能。可以在 MySQL 的系统配置文件中开启慢查询日志,并设置 SQL 执行时间超过多少就记录到日志文件中,比如说项目设置的是 2 秒,超过这个时间的 SQL 就会记录在日志文件中,我们就可以在日志文件中找到执行慢的 SQL 语句。

        2.0 发现了 SQL 语句执行很慢,如何分析呢?

        如果一条 SQL 执行很慢,通常会使用 MySQL 的 EXPLAIN 命令来分析这条 SQL 的执行情况。通过 key 和 key_len 可以检查是否命中了索引,如果已经添加了索引,也可以判断索引是否有效。通过 type 字段可以查看 SQL 是否有优化空间,比如是否存在全索引扫描或全表扫描。通过 extra 建议可以判断是否出现回表情况,如果出现,可以尝试添加索引或修改返回字段来优化。

        3.0 什么是索引?

        索引在项目中非常常见,它是一种帮助 MySQL 高效获取数据的数据结构,主要用来提高数据检索效率。降低数据库的 I/O 成本。同时,索引列可以对数据进行排序,降低数据排序的成本,也能减少 CPU 的消耗。

        4.0 索引的底层数据结构了解过吗?

        MySQL 默认存储引擎 InnoDB 使用的是 B+ 树作为索引的存储结构。选择 B+ 树的原因包括:节点可以有更多子节点,路径更短;磁盘读写代价更低,非叶子节点只存储键值和指针,叶子节点存储数据;B+ 树适合范围查询和扫描,因为叶子节点形成了一个双向链表。

        5.0 B 树与 B+ 树的区别是什么呢?

        B 树和 B+ 树的主要区别在于:

        1)B 树的非叶子节点和叶子节点都存放数据,而 B+ 树的所有数据只出现在叶子节点,这使得 B+ 树在查询效率更稳定。

        2)B+ 树在进行范围查询时效率更高,因为所有数据都在叶子节点,并且叶子节点之间形成了双向链表。

        6.0 什么是聚簇索引?什么是非聚簇索引?

        聚簇索引是指数据与索引放在一起,B+ 树的叶子节点保存了整行数据,通常只有一个聚簇索引,一般是由主键构成。

        非聚簇索引则是数据与索引分开存储,B+ 树的叶子节点保存的是主键值,可以有多个非聚簇索引,通常可以自定义的索引都是非聚簇索引。

        7.0 知道什么是回表查询吗?

        回表查询是指通过二级索引找到对应的主键值,然后再通过主键值查询聚簇索引中对应整行数据的过程。

        8.0 知道什么是覆盖索引吗?

        覆盖索引是指在 SELECT 查询中,返回的列全部能在索引中找到,避免了回表查询,提高了性能。使用覆盖索引可以减少对主键索引的查询次数,提高查询效率。

        9.0 MySQL 超大分页怎么处理?

        超大分页通常发生在数据量大的情况下,使用 LIMIT 分页查询且需要排序时效率较低。可以通过覆盖索引和子查询来解决。首先查询数据的 ID 字段进行分页,然后根据 ID 列表用子查询来过滤这些 ID 的数据,因为查询 ID 时使用的是覆盖索引,所以效率可以提升。

        10.0 索引创建原则有哪些?

        创建索引的原则包括:

        1)表中的数据量超过 10 万以上时考虑创建索引。

        2)选择查询频繁的字段作为索引,如查询条件、排序条件或分组字段。

        3)尽量使用复合索引,覆盖 SQL 返回值。

        4)如果字段区分度不高,可以使用前缀索引。

        5)控制索引数量,因为索引虽然可以提高查询速度,但也会影响插入、更新的速度。

        11.0 什么情况下索引失效?

        索引可能在以下情况下失效:

        1)没有遵循最左匹配原则。

        2)使用了模糊查询且 % 号在前面。

        3)在索引字段上进行了运算或类型转换。

        4)使用了复合索引但在中间使用了范围查询,导致右边的条件索引失效。

        12.0 SQL 的优先经验有哪些?

        SQL 优先可以从以下几个方面考虑:

        1)建表时选择合适的字段类型。

        2)使用索引,遵循创建索引的原则。

        3)编写高效的 SQL 语句,比如避免使用 SELECT *,尽量使用 UNION ALL 代替 UNION,以及在表关联时使用 INNER JOIN 。

        4)采用主从复制和读写分离提高性能。

        5)在数据量大时考虑分库分表。

        13.0 创建表的时候,是如何优化的呢?

        创建表的时候,主要参考《嵩山版》开发手册,选择字段类型时结合字段内容,比如数值类型选择 TINYINT、INT、BIGINT 等,字符串类型选择 CHAR、VARCHAR 或 TEXT 。

        14.0 在使用索引的时候,是如何优化呢?

        在使用索引时,遵循索引创建原则,确保索引字段是查询频繁的,使用复合索引覆盖 SQL 返回值,避免在索引上进行运算或类型转换,以及控制索引数量。

        15.0 对 SQL 语句做了哪些优化呢?

        对 SQL 语句的优化包括指明字段名称而不是使用 SELECT *,避免造成索引失效的写法,聚合查询时使用 UNION ALL 代替 UNION,表关联时优先使用 INNER JOIN,以及在必须使用 LEFT JOIN 或 RIGHT JOIN 时,确保小表作为驱动表。

        16.0 事务的特性是什么?可以详细说一下吗?

        事务的特性是 ACID,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。比如,A 向 B 转账 500 元,这个操作要么都成功,要么都失败,体现了原子性。转账过程中数据要保持一致,A 扣除了 500 元,B 必须增加 500 元。隔离性体现在 A 向 B 转账时,不受其他事务干扰。持久性体现在事务提交之后,数据要被持久化存储。

        17.0 并发事务带来哪些问题?

        并发事务可能导致脏读、不可重复读和幻读。脏读是指一个事务读到了另一个事务未提交的 "脏数据" 。不可重复读是指在一个事务内多次读取同一数据,由于其他事务的修改导致数据不一致。幻读是指一个事务读取到了其他事务插入的 "幻行" 。

        18.0 怎么解决这些问题?MySQL 的默认隔离级别是?

        解决这些问题的方法是使用事务隔离。MySQL 支持四种隔离级别:

        1)未提交读(READ UNCOMMITTED):解决不了所有问题。

        2)读已提交(READ COMMITED):能解决脏读,但不能解决不可重复读和幻读。

        3)可重复读(REPEATABLE READ):能解决脏读和不可重复读,但不能解决幻读,这也是 MySQL 的默认隔离级别。

        4)串行化(SERIALIZABLE):可以解决所有问题,但性能较低。

        19.0 undo log 和 redo log 的区别是什么?

        redo log 记录的是数据页的物理变化,用于服务宕机后的恢复,保证事务的持久性。而 undo log 记录的是逻辑日志,用于事务回滚时恢复原始数据,保证事务的原子性和一致性。

        20.0 事务中的隔离性是如何保证的呢?(解释一下 MVCC)

        事务的隔离性通过锁和多版本并发控制(MVCC)来保证。MVCC 通过维护数据的多个版本来避免读写冲突。底层实现包括隐藏字段、undo log 和 read view。隐藏字段包括 trx_id 和 roll_pointer。undo log 记录了不同版本的数据,通过 roll_pointer 形成版本链。read view 定义了不同隔离级别下的快照读,决定了事务访问哪个版本的数据。

        21.0 MySQL 主从同步原理是什么?

        MySQL 主从复制的核心是二进制日志(Binlog)。步骤如下:

        1)主库在事务提交时,记录数据变更到 Binlog 。

        2)从库读取主库的 Binlog 并写入中继日志(Relay Log)。

        3)从库重做中继日志中的事件,反映到自己的数据中。

        22.0 项目用过 MySQL 的分库分表吗?

        项目中采用微服务架构,每一个微服务对应一个数据库,是根据业务进行拆分的,这个其实就是垂直拆分。

        23.0 那你之前使用过水平分库吗?

        使用过。当时业务发展迅速,某个表数据量超过 1000 万,单库优化后性能仍然很慢,因此采用了水平分库。首先部署了 3 台服务器和 3 个数据库,使用 mycat 进行数据分片。旧数据也按照 ID 取模规则迁移到各个数据库中,这样数据库可以分摊存储和读取压力,解决了性能问题。

        希望这篇文章可以帮助到您,可以解决您的燃眉之急。如果还需要更加详细的 MySQL 的内容,请关注:MySQL 篇_小扳的博客-ZEEKLOG博客

Read more

EtherCAT在机器人多轴控制中的实战应用与性能优化

EtherCAT在工业机器人多轴控制中的实战优化与性能突破 工业机器人正经历从单轴独立控制向多轴协同作业的演进,而EtherCAT凭借其微秒级同步精度和灵活的拓扑结构,已成为高端装备制造领域的通信标准。在半导体晶圆搬运、包装机械高速分拣等场景中,传统脉冲控制方案正被基于EtherCAT的分布式时钟体系所替代。本文将深入解析如何通过协议优化、硬件选型和网络设计,实现128轴以上系统的抖动控制在±100ns以内。 1. EtherCAT核心技术解析与性能优势 EtherCAT的革新性在于其"On-the-fly"数据处理机制。与常规工业以太网不同,EtherCAT从站设备采用专用ASIC芯片(如ET1100、ET1200)进行帧处理,数据延迟仅纳秒级。在汽车焊接机器人案例中,采用分布式时钟同步的6轴系统可实现循环周期250μs,位置控制精度达±1μm。 关键性能指标对比: 参数脉冲控制CANopenEtherCAT同步精度±1ms±500μs±100ns单周期最大轴数8轴32轴256轴拓扑灵活性星型总线型任意拓扑电缆最大长度20m100m100m(铜缆)/2km(光纤)单帧

By Ne0inhk
OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,

By Ne0inhk
组建龙虾团队——OpenClaw多机器人构建

组建龙虾团队——OpenClaw多机器人构建

成功搭建了OpenClaw,也成功建立的自己的每日服务,这时候发现,似乎不太敢在当前的机器人中让他做别的事情,生怕会话太多会让他出现遗忘。(尽管我们配置了QMD记忆增强,但毋庸置疑任何技术都是有上限的)。 换做同样的情况,比如在DeepSeek或者豆包之类的对话窗口,我们会习惯性地新建一个对话。那么我们是否可以新建一个机器人,或者多个机器人,让他们各司其职,各尽所能,形成一个相互配合的团队呢~开干吧,没什么不可能的!! 🦞新建一个机器人 来到飞书开发者后台,新创建一个应用,在这里我们以短视频剪辑脚本应用为例。 创建之后,由于我们的openclaw绑定的是之前的飞书渠道,并没有链接到这个应用的APP ID,所以暂时不做其他操作,只需要记录一下他的APP ID和APP Secret。 🦞配置OpenClaw 如果还是按照claw的命令行安装,每一步都有些让人担心害怕,毕竟我们先前已经配置过一次了,接下来的操作,需要小心是否会把以前的配置给覆盖掉。 为了避免这样的不确定性,我们直接去操作他的配置文件 在WSL2终端中进入openclaw目录 cd .openclaw

By Ne0inhk
XILINX PCIE IP核详解、FPGA实现及仿真全流程(Virtex-7 FPGA Gen3 Integrated Block for PCI Express v4.3)

XILINX PCIE IP核详解、FPGA实现及仿真全流程(Virtex-7 FPGA Gen3 Integrated Block for PCI Express v4.3)

一、XILINX几种IP核区别         传统系列芯片 IP核名称核心特点用户接口开发难度适用场景7 Series Integrated Block for PCI Express最基础的PCIe硬核,提供物理层和数据链路层AXI4-Stream TLP包最高,需处理TLP包需深度定制PCIe通信,对资源敏感的项目AXI Memory Mapped To PCI Express桥接IP,将PCIe接口转换为AXI接口AXI4内存映射中等,类似操作总线FPGA需主动读写主机内存,平衡效率与灵活性DMA/Bridge Subsystem for PCI Express (XDMA)集成DMA引擎,提供"一站式"解决方案AXI4 (另有AXI-Lite等辅助接口)最低,官方提供驱动高速数据批量传输(如采集卡),追求开发效率         注意:         1.硬件平台限制:不同系列的Xilinx FPGA(如7系列、UltraScale、Versal)支持的PCIe代数和通道数可能不同。在选择IP核前,请务必确认您的FPGA型号是否支持所需的PCIe配置(

By Ne0inhk