自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 Mysql:分库分表

本文系统探讨了MySQL分库分表技术,分析了其在应对海量数据和高并发场景中的核心作用。文章详细介绍了分库(垂直/水平)和分表的技术原理,阐述了分片键选择标准和三种主流分片算法(哈希取模、范围分片、一致性哈希)的特点与应用场景。针对分库分表实施后带来的分布式事务、跨库查询、数据迁移等挑战,提出了包括柔性事务、异构索引等解决方案。文章强调分库分表虽能显著提升系统扩展性,但会引入架构复杂度,需要结合业务特点谨慎采用,并推荐使用成熟中间件降低实施难度。

2025-07-11 16:38:26 1093

原创 Mysql分片:一致性哈希算法

一致性哈希是解决分布式系统扩容问题的关键技术。它通过构建虚拟哈希环,将数据和节点映射到环上,依据顺时针查找原则确定数据存储位置。当节点增减时,仅需迁移相邻区间数据,避免了传统哈希取模导致的大规模数据迁移。以分布式缓存系统为例,新增节点CacheD时,只影响CacheB到CacheD之间的数据,其他数据保持不变。这种设计显著提升了系统的伸缩性和稳定性,是构建高扩展性分布式系统的理想选择。

2025-07-10 16:52:44 877

原创 一条SQL语句的执行过程

MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块 (binlog),这个日志模块所有执行引擎都可以共用,redolog 只有 InnoDB 有。引擎层是插件式的,目前主要包括 MyISAM,InnoDB,Memory 等。查询语句的执行流程如下: 权限校验 (如果命中缓存) --->查询缓存--->分析器--->优化器--->权限校验--->执行器--->引擎。

2025-07-10 10:52:59 924

原创 Mysql: Bin log原理以及三种格式

MySQL Binlog是记录数据库变更的二进制日志文件,支持数据恢复、主从复制和数据审计等核心功能。Binlog有三种格式:STATEMENT记录SQL语句,日志小但可能主从不一致;ROW记录行级变更,确保一致性但日志较大;MIXED模式智能切换两种格式以平衡性能和安全性。主从复制通过Binlog实现,主库记录变更,从库同步执行,确保数据一致性。Binlog还支持时间点恢复和操作审计,是MySQL数据安全与高可用的关键机制。推荐使用MIXED模式兼顾效率与可靠性。

2025-07-09 15:14:13 947

原创 redo log 详解

Redo log是InnoDB存储引擎的核心机制,用于确保事务持久性和数据库崩溃恢复。它采用WAL(预写日志)技术,将数据页修改先记录到日志而非直接刷盘,通过顺序I/O代替随机I/O提升性能。Redo log由内存中的redo log buffer和磁盘上的循环日志文件组成,支持三种刷盘策略(0/1/2)平衡安全性与性能。在银行转账等事务场景中,即使系统崩溃,也能通过重放redo log保证数据一致性。该机制有效解决了直接刷盘导致的I/O瓶颈问题,兼顾了数据库的高并发与数据可靠性。

2025-07-09 10:41:58 813

原创 白盒测试:五大覆盖(语句,判定,条件,判定/条件,路径)详解

本文深入探讨了软件测试领域中至关重要的白盒测试及其五大核心代码覆盖率标准。从最基础的语句覆盖,到关注决策点的判定覆盖和子条件的条件覆盖,再到二者结合的判定/条件覆盖,直至最全面的路径覆盖,文章通过清晰的 Java 代码示例、直观的图表(提示读者自行绘制)和详细的测试用例设计,层层递进地揭示了每种覆盖率的原理、优缺点及实际应用。尤其着重辨析了易混淆的判定覆盖与路径覆盖、条件覆盖与判定/条件覆盖之间的细微区别,帮助读者全面理解白盒测试如何穿透代码表象,保障软件的内在质量。

2025-06-25 16:20:21 1535

原创 黑盒测试:等价类划分、边界值分析和决策表测试

黑盒测试是一种在不了解软件内部实现的情况下,通过输入输出验证功能是否符合需求的测试方法。其核心特点包括外部用户视角、基于需求文档、不关注代码实现等。常用测试技术包括:1. 等价类划分法(将输入分为有效/无效等价类);2. 边界值分析法(重点测试输入边界值);3. 决策表测试(处理多条件组合逻辑)。这三种方法优势互补,可结合使用提升测试效率。黑盒测试是保障软件质量的重要手段,通过模拟用户行为验证系统功能,在软件测试过程中发挥关键作用。

2025-06-25 11:21:29 1509

原创 UML:类图

摘要: UML类图是描述系统静态结构的核心工具,主要用于展示类、接口及其相互关系。文章详细解析了类图的三大要素:1)类(包括抽象类)的三层结构表示;2)接口的两种表示方法;3)六种核心关系:关联、聚合、组合、依赖、泛化和实现,每种关系都配有代码示例和UML图示。通过"图形工厂"的完整案例,展示了如何将需求转化为类图,重点演示了抽象类、继承关系和工厂模式中的依赖关系。掌握类图有助于提升系统设计能力,促进团队沟通,确保代码与设计的一致性。

2025-06-22 16:13:03 1195

原创 UML:状态图介绍与绘制

摘要:UML状态图是描述对象生命周期中状态变化的行为建模工具。它通过状态、转换、事件等核心元素,可视化对象如何响应事件而改变行为模式。状态图能捕捉复杂逻辑、模拟事件响应、验证设计健壮性,适用于UI交互、嵌入式系统等场景。绘制时需确定对象状态、初始/最终状态、转换事件及条件,并处理复合状态等复杂情况。掌握状态图有助于设计更健壮的系统,提升开发效率和团队沟通。本文系统讲解了状态图的组成要素和绘制方法,为软件工程实践提供了实用指导。

2025-06-21 19:52:49 803

原创 MySQL MVCC: 0 到 1 的系统理解其原理

摘要: MVCC是InnoDB实现高并发的核心技术,通过保存数据历史版本解决读写冲突。其核心机制包括:1)隐藏列(事务ID、回滚指针)标识数据版本;2)UndoLog版本链记录数据变更历史;3)读视图(ReadView)机制控制事务可见范围。在RC级别每次查询生成新视图,解决脏读但存在不可重复读;RR级别事务首次查询生成固定视图,解决不可重复读。MVCC使读操作无需加锁,写操作仅加必要锁,实现读写不阻塞的高并发访问。理解MVCC原理有助于优化SQL、选择合适隔离级别和设计高并发系统。

2025-06-19 13:41:53 1877

原创 MySQL 锁:从全局到行,一文读懂所有锁的奥秘

本文详细解析了MySQL数据库中的锁机制,从全局锁、表级锁到行级锁,全面介绍各类锁的功能特点与应用场景。文章首先阐述了锁的必要性,解释了并发访问带来的数据不一致问题。随后系统讲解了全局锁(FLUSH TABLES WITH READ LOCK)、表级锁(共享/排他锁)、元数据锁(MDL)的作用原理和使用方法。重点剖析了InnoDB特有的意向锁机制和行级锁体系(记录锁、间隙锁、临界区锁),并通过车队表实例演示各种锁在SQL操作中的实际表现。最后对比了悲观锁与乐观锁的差异,总结了如何根据业务需求选择合适的锁策略

2025-06-16 15:03:19 1479

原创 MySQL 索引失效:六大场景与原理剖析

本文探讨了MySQL中索引失效的原因及优化方法。尽管索引是提高查询性能的有力工具,但在某些情况下,索引可能会失效,导致查询速度缓慢。这并非Bug,而是查询优化器(CBO)基于成本模型做出的选择,认为全表扫描比使用索引更划算。常见的索引失效场景包括在索引列上使用函数或运算、LIKE查询以通配符开头、隐式类型转换、违反复合索引的最左前缀原则、使用OR条件以及范围查询或不等式。为避免索引失效,开发者应保持索引列的“纯净”,遵循索引结构,降低回表成本,并利用EXPLAIN工具进行诊断和优化。

2025-06-08 15:16:10 974

原创 MySQL SQL 优化:从 INSERT 到 LIMIT 的实战与原理

这篇博客深入探讨MySQL SQL优化策略与原理,旨在提升数据库性能。从INSERT语句入手,揭示批量插入、LOAD DATA INFILE及事务管理的优势,解析页分裂影响。文章强调自增短小主键在InnoDB聚簇索引中的作用,优化写入和二级索引回表。剖析ORDER BY和GROUP BY的性能陷阱,建议创建复合索引和利用覆盖索引。最后,讨论LIMIT分页瓶颈,提供延迟回表子查询和游标式分页策略。通过EXPLAIN分析和案例,提供SQL优化指南,助力构建高性能应用。

2025-06-07 20:12:08 2341

原创 洞悉 MySQL 查询性能:EXPLAIN 命令 type 字段详解

本文深入剖析了 MySQL EXPLAIN 命令中的核心字段 type,它是评估查询性能的关键指标。文章详细讲解了 type 字段的各个取值(从最优的 system 到最差的 ALL),以及它们对应的查询方式、触发条件和优化原理。通过实际案例,展示了如何利用 type 字段识别性能瓶颈,指导索引优化,最终提升查询速度。文章还重点对比了多表联接中 eq_ref 和 ref 的差异,并总结了优化实践要点,旨在帮助读者全面掌握 type 字段,从而有效地进行 MySQL 数据库性能调优。

2025-06-06 15:03:07 1166

原创 MySQL 回表、索引覆盖与查询优化

这篇文章深入解析了MySQL中的“回表”问题及其优化方案。回表是指通过非主键索引查询时,需要返回聚簇索引获取完整数据,导致额外I/O开销。核心优化方法是“索引覆盖”——让查询所需数据都能直接从索引获取。实现策略包括:创建包含查询列的复合索引、精简查询列、优先使用主键查询等。文章还介绍了通过EXPLAIN判断是否发生回表,并提供了电商案例说明如何应用索引覆盖优化查询。合理使用索引覆盖能显著减少I/O操作,提高查询性能,但同时要注意索引维护成本。

2025-06-06 10:18:49 1113

原创 MySQL 索引:聚集索引与二级索引

MySQL索引优化指南:聚集索引与二级索引详解 本文深入探讨MySQL InnoDB中两种核心索引类型。聚集索引决定数据物理存储顺序,叶子节点直接存储完整行数据,每表仅一个,主键查询高效但写入成本可能较高。二级索引独立存储,叶子节点只含索引列和主键值,支持多索引但需回表查询,覆盖索引可优化性能。关键区别在于:聚集索引直接关联数据存储,二级索引需二次查找。实践建议包括:选择有序主键、合理设计二级索引、避免过度索引,并注意不同存储引擎的索引实现差异。理解这些机制对数据库设计和查询优化至关重要。

2025-06-05 16:32:33 1083

原创 MySQL 索引:为何使用 B+树作为索引数据结构,而非 B树、哈希表或二叉树?

MySQL为何选择B+树作为索引结构?本文深入剖析了数据库索引的核心挑战和四种常见数据结构的优劣。B+树凭借低树高(减少磁盘I/O)、叶子节点链表(高效范围查询)、高度平衡等特性脱颖而出。相比之下,B树范围查询效率低,哈希表不支持范围查询和排序,二叉树则因树高过高导致磁盘I/O瓶颈。通过对比表格直观展示各结构特点,最终证明B+树在关系型数据库的海量数据存储、多样化查询需求和高并发更新间找到了最佳平衡点,成为MySQL索引的理想选择。

2025-06-04 20:02:02 1801

原创 MySQL 事务的 ACID 四大特性及其实现原理

MySQL事务的ACID特性是保障数据一致性和可靠性的核心机制。原子性(Atomicity)通过UndoLog确保事务完全执行或回滚;一致性(Consistency)要求数据始终符合业务规则;隔离性(Isolation)通过锁和MVCC机制处理并发访问;持久性(Durability)依托RedoLog等确保数据永久存储。这四大特性相互协作,既维护了数据的正确性,又平衡了系统性能。深入理解ACID原理对开发安全高效的数据库应用至关重要,能有效避免并发问题并优化系统设计。

2025-06-04 15:33:46 1353

原创 Java线程状态及其流转

本文详细介绍了Java线程的七种状态及其转换机制。线程从新建(New)到终止(Terminated)的生命周期包括:新建调用start()进入就绪(Runnable),被调度后运行(Running),可能因获取锁失败变为阻塞(Blocked),调用wait()进入等待(Waiting),带超时的方法进入超时等待(TimedWaiting)。状态转换由方法调用或系统调度触发,理解这些转换关系对多线程编程至关重要,有助于正确管理线程并发行为。掌握线程状态流转机制是Java并发编程的基础。

2025-06-03 15:40:00 999

原创 深入理解:为什么 Java HashMap 扩容为原数组长度的 2 倍?

本文深入解析了 HashMap 为何采用 2 倍扩容 而非 1.5 倍或 3 倍,核心原因在于:数组长度保持为 2 的幂可使 (hash & (n - 1)) 的定位逻辑更高效。在扩容时,仅需通过 hash & oldCap 的结果判断元素是否迁移,避免重新计算哈希,提高性能。文中通过二进制示例详细演示了该迁移逻辑,揭示了 HashMap 在扩容设计上的性能与实现智慧。

2025-06-03 11:37:50 883

原创 ArrayList线程不安全的原因与解决方案

本文深入剖析了 ArrayList 在并发环境下为何线程不安全,分析揭示其底层原因,并系统总结了可能引发的问题,如数据覆盖、越界、数据丢失等。随后对三种主流解决方案——Vector、Collections.synchronizedList()、CopyOnWriteArrayList 进行原理讲解与对比,帮助读者根据不同场景选择合适的并发容器。

2025-06-02 15:45:16 1672

原创 Java集合的分类及其区别详解

Java集合框架分为Collection和Map两大体系:前者存储单一元素(如List、Set、Queue),后者存储键值对。List有序可重复(ArrayList查询快、LinkedList增删快),Set无序唯一(HashSet高效、TreeSet有序)。Map中HashMap最常用,TreeMap支持排序。核心区别在于有序性、重复性和底层结构(数组/链表/哈希表/红黑树)。开发时应根据查询、插入、排序等需求选择合适集合,并注意线程安全场景的特殊处理。掌握集合底层原理对性能优化和面试至关重要。

2025-06-02 09:50:32 875

原创 HashMap 的负载因子与扩容机制

本文深入解析Java HashMap的三个核心问题:1)负载因子(默认0.75)用于控制扩容时机,权衡查找性能与内存使用;2)0.75通过实证确定为性能与空间的最优平衡点;3)扩容时掩码位数增加,能利用hash值更多位来区分不同key,从而减少冲突。HashMap通过精妙的位运算和扩容策略,在保持hash值不变的情况下实现高效扩容,体现了Java集合类的优秀设计思想。

2025-05-29 16:35:01 1190

原创 HashMap的添加元素流程:put方法全流程详解

本文深入剖析了 Java 中 HashMap 添加元素的核心流程——put 方法的源码实现。通过详细解读哈希值计算、桶数组定位、链表遍历与红黑树转换、扩容机制等关键步骤,系统揭示了 HashMap 高效存储与冲突解决的底层设计原理。文章不仅帮助读者理解 HashMap 的工作细节,还总结了设计中的三大策略和实际应用建议,为Java开发者和面试准备者提供了全面且实用的技术指导。

2025-05-28 20:28:44 2657

原创 MySQL 存储引擎简单介绍

MySQL存储引擎决定了数据表的功能特性与性能表现,主要包括InnoDB(支持事务、行级锁,适用于高并发)、MyISAM(读多写少场景)、MEMORY(内存存储)等类型。选择引擎需考虑业务需求,如事务支持、并发访问、数据恢复等要素。InnoDB因其全面性成为默认引擎,其他引擎各有适用场景。通过CREATETABLE/ALTERTABLE可指定或修改表引擎,合理的引擎选择能显著提升数据库性能与可靠性。

2025-05-27 16:59:10 932

原创 MySQL 并发事务的问题与事务隔离级别

在高并发环境下,数据库事务操作可能引发脏读、不可重复读、幻读和丢失更新等数据一致性问题。本文系统梳理了这四大并发问题的本质,并结合 MySQL 的四种事务隔离级别(Read Uncommitted、Read Committed、Repeatable Read、Serializable),通过详细案例演示它们如何解决或暴露不同类型的问题。同时分析各隔离级别的机制差异(如 MVCC、加锁策略)及其对性能和一致性的影响。最后提供针对不同业务场景的隔离级别选型建议,帮助读者在保证数据安全的同时,合理优化系统并发性能

2025-05-26 16:12:47 2845

原创 理解 ArrayList:指定初始化容量的重要性

这其实是使用了ArrayList的无参构造函数默认不指定初始容量。但是其实ArrayList这里的100这个 ArrayList 初始化时,会准备一个长度为 100 的数组,用于存储元素。默认创建 ArrayList 时,如果不指定初始容量,会从一个很小的容量(默认是10)开始,当添加元素数量超过当前容量时,会触发多次扩容。扩容涉及数组创建和元素复制,性能开销较大。因此,如果我们能够预估元素数量,建议通过构造方法指定初始化容量,比如,可以有效避免扩容,提高性能,尤其在数据量较大的场景中,效果明显。

2025-05-24 18:30:00 287

原创 《Java 集合迭代器深度解析:统一遍历背后的原理与设计思想》

Java迭代器通过统一接口实现不同集合结构的遍历。迭代器模式使得ArrayList、LinkedList等集合类只需要实现Iterator接口中的hasNext()、next()等方法,就能以相同方式访问各自的数据结构。Iterable接口要求所有集合提供iterator()方法,返回定制化的迭代器对象,封装了特定集合的遍历逻辑。这种设计利用多态性,让用户无需关心底层实现(数组、链表、哈希表等),只需通过统一的Iterator接口操作集合元素,实现了遍历行为的标准化与解耦,体现了面向对象编程的抽象优势。

2025-05-24 13:48:39 1233

原创 深入理解 Spring AOP:JDK 动态代理实现原理剖析

Spring AOP(面向切面编程)通过“横切逻辑”增强业务逻辑,如日志、安全等。Spring默认使用JDK动态代理或CGLIB生成代理对象,JDK动态代理要求目标类实现接口,否则使用CGLIB。在Spring启动阶段,会扫描并注册切面类,将增强方法封装为Advisor,并转化为MethodInterceptor。当用户请求触发方法调用时,代理对象会拦截方法并执行拦截器链,依次执行切面逻辑,最终调用目标方法并返回结果。通过动态代理,Spring AOP实现了对业务逻辑的无侵入增强。

2025-05-23 15:04:51 1186

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除