- 博客(1134)
- 收藏
- 关注
原创 Redis:IO多路复用深度解析
多路复用快的原因在于,操作系统提供了这样的系统调用,使得原来的 while 循环里多次系统调用,变成了一次系统调用 + 内核层遍历这些文件描述符。所谓 I/O 多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。这种机制的使用需要 select 、 poll 、 epoll 来配合。多个连接共用一个阻塞对象,应用程序只需要在一个阻塞对象上等待,无需阻塞等待所有连接。
2023-07-06 12:09:39
4469
2
原创 为什么 Nginx 代理后,静态资源加载到 80 端口?
Nginx反向代理静态资源端口问题解决方案 当使用Nginx反向代理时,静态资源可能加载到默认80端口而非代理端口(如8888或9000),主要原因是后端URL生成逻辑未正确处理代理端口。 问题原因 静态资源路径硬编码,导致浏览器请求默认80端口 Nginx代理配置未正确传递端口信息,后端无法获取真实访问端口 解决方案 动态生成基础路径:后端根据请求动态生成包含正确协议、主机和端口的basePath Nginx配置优化: 设置proxy_set_header Host $host:$server_port
2025-12-30 14:47:05
596
原创 深入理解 PropertySource 与优先级:Spring Boot/Spring Cloud 配置体系的底层原理
本文深入剖析了Spring Boot/Cloud项目中配置加载的核心机制——PropertySource体系。通过分析Environment中的PropertySource有序列表,揭示了配置优先级的关键规则:列表越靠前的配置源优先级越高。文章结合实际项目打印结果,展示了本地文件(properties>yml>yaml)、Nacos配置(私有>共享)及系统变量的真实优先级顺序,并指出Nacos配置的优先级与spring.config.import声明顺序直接相关(后声明的优先级更高)。掌握
2025-12-30 14:43:03
1007
1
原创 Java 对象到底占多少内存?手算 new Object / int[2] / long[2] / new String(对象头·实例数据·对齐填充全拆解)
本文分析了四种Java对象在64位HotSpot JVM(开启指针压缩)下的内存占用情况: new Object():对象头12B(Mark Word 8B + Klass Pointer 4B),无实例数据,对齐填充4B,总计16B。 new int[2]:数组头16B(含length字段),实例数据8B(2个int元素),无需填充,总计24B。 new long[2]:数组头16B,实例数据16B(2个long元素),总计32B。 new String()(Java 9+):对象头12B,实例数据10B
2025-12-29 16:36:04
992
原创 Java 内存溢出(OOM)排查实战指南:从复现到 MAT Dump 分析
摘要:本文介绍了Java中OOM(内存溢出)问题的排查方法。首先解释了OOM的常见类型和原因,包括堆空间不足、本地缓存无限增长、内存泄漏等。通过Demo演示了如何快速复现OOM并生成Heap Dump文件。重点讲解了使用MAT工具分析Dump的步骤:查看Leak Suspects报告、Histogram统计、Dominator Tree分析以及Path to GC Roots追踪引用链。最后给出了修复OOM的常见方法,如限制缓存大小、优化数据结构等。文章提供了完整的OOM排查流程,帮助开发者快速定位和解决内
2025-12-29 16:34:36
887
原创 合理使用 instanceof:边界层的应用与业务层的避免
本文探讨了Java中instanceof的合理使用场景。指出instanceof并非设计缺陷,关键在于使用场景的选择。文章推荐在两个边界层场景中使用:1)DTO到VO的转换(仅做数据映射,不涉及业务逻辑);2)通用工具类(处理基础类型,无业务语义)。同时强调instanceof不应出现在业务核心层,而应使用多态。通过示例代码展示了安全使用方式,并提出判断原则:若用于"判断数据形态"则可用,若用于"决定对象行为"则应避免。最终结论是合理限制instanceof的使用范围
2025-12-26 10:02:05
589
原创 MySQL 分区表应用案例:优化数据管理与性能
本文探讨了MySQL分区表在医院管理系统中的应用,针对海量患者数据管理中的查询和删除性能问题提出解决方案。文章介绍了RANGE和LIST两种分区方式,并给出具体案例:1)按就诊年份分区,可高效查询和删除年度数据;2)按科室分区,能快速处理特定科室的数据操作。通过分区表技术,系统能够显著提升大数据量下的查询效率,实现快速历史数据清理,避免全表扫描和锁表问题。这种优化方法有效提高了医院数据库管理的性能和灵活性,适用于需要处理数亿条记录的场景。
2025-12-26 09:59:46
1022
原创 Maven <dependencyManagement>:如何在多模块项目中集中管理依赖版本
Maven的<dependencyManagement>功能是多模块项目管理的利器,它能集中管理所有子模块的依赖版本,确保项目一致性和可维护性。本文通过示例项目展示了如何通过父POM统一管理依赖版本,子模块只需引用依赖而无需指定版本号。这种方式有效避免了版本冲突问题,简化了依赖维护,特别适用于Spring Boot、Jackson等复杂依赖场景。合理使用<dependencyManagement>能显著提升多模块项目的开发效率和管理质量。
2025-12-25 17:23:21
704
原创 Spring AOP 中 JoinPoint 使用指南
JoinPoint是Spring AOP中获取方法运行时信息的核心接口,表示方法执行的切入点。它能获取方法参数、目标对象、代理对象、方法名、类名、方法签名、Method对象以及方法上的注解等信息。通过JoinPoint可以实现接口日志打印、幂等签名生成、参数校验、审计记录等常见功能。在AOP开发中,JoinPoint是注解驱动业务的基础,广泛应用于防重复提交、业务操作日志、权限校验等场景。要获取方法注解,需要先通过MethodSignature获取Method对象。JoinPoint作为AOP的"
2025-12-25 16:20:55
992
原创 HTTP 状态码一览:理解 2xx、3xx、4xx 和 5xx 分类
HTTP状态码是3位数字代码,用于表示服务器对请求的处理结果。主要分为4类:2xx(成功,如200/201/204)、3xx(重定向,如301/302/304)、4xx(客户端错误,如400/401/403/404)和5xx(服务器错误,如500/502/503)。2xx表示请求成功处理,3xx需要客户端重定向,4xx是客户端请求错误,5xx则是服务器内部问题。开发中建议结合HTTP状态码和业务状态码使用,REST风格推荐查询成功返回200,创建成功201,删除成功204,参数错误400等。掌握状态码分类有
2025-12-25 09:53:19
1065
原创 StringRedisTemplate vs RedisTemplate:该怎么选?
本文系统对比了Spring Boot中StringRedisTemplate和RedisTemplate的核心区别与使用场景。关键点包括: 本质区别在于默认序列化方式:StringRedisTemplate使用字符串序列化,RedisTemplate默认使用JDK序列化 生产环境差异: StringRedisTemplate兼容redis-cli/Lua/多语言,安全可靠 默认RedisTemplate会导致数据不可读和Lua脚本失效 正确使用方式: 简单数据/Lua场景:优先使用StringRedisTe
2025-12-24 10:54:00
665
原创 Java 可变参数 Object... args 详解:原理、用法与实战场景
摘要: Java中的Object... args是可变参数(Varargs),本质是编译器自动转换为数组的语法糖,允许方法接收0到多个参数。它必须位于参数列表末尾,且方法内可直接作为数组使用。相比Object[],可变参数调用更简洁(可省略参数),适合API设计。常见于Spring、Redis等框架,如execute(script, keys, args...)支持灵活传参。需注意:可变参数永不为null,而显式传null会被视为单参数"null"。该特性提升了API的可用性和扩展性,是
2025-12-24 10:51:48
667
原创 Redis Lua 脚本核心语法详解:KEYS[1]、ARGV[1]、tonumber 是什么意思?
本文介绍了Redis Lua脚本中KEYS和ARGV参数的使用方法。KEYS数组用于存放Redis键名,其索引从1开始(Lua语言特性),在集群环境中帮助正确路由;ARGV数组存放普通参数,Redis会将所有参数转为字符串传入。重点强调了必须使用tonumber()函数将ARGV参数转换为数值类型才能进行数学运算,并给出了库存扣减的完整示例脚本。文章还指出了常见误区,如不区分KEYS和ARGV、不进行类型转换等。理解这三个核心概念(KEYS[1]、ARGV[1]和tonumber)是掌握Redis Lua脚
2025-12-24 10:29:37
627
原创 一次真实 GC 实验:Parallel 与 G1 在 `Xms < Xmx` 下的日志对比分析
本文基于Java 17,通过真实GC日志对比了Parallel GC和G1 GC在Xms<Xmx场景下的行为差异。实验使用持续创建1MB大对象的代码,发现Parallel GC在扩容时必然触发Full GC,导致频繁STW;而G1 GC虽能平滑扩容,但Humongous对象仍可能导致最终Compaction Full GC。研究表明,生产环境推荐Xms=Xmx:Parallel GC可避免扩容Full GC,G1 GC能预防Humongous Region耗尽风险。两种GC在不设等值时都会增加OOM风
2025-12-23 14:31:54
1041
原创 为什么说「基于 Region 的停顿时间模型」是 G1 可预测停顿的前提?
摘要: G1垃圾回收器的核心优势在于可预测的停顿时间,其关键在于将堆划分为等大小的Region。传统GC因回收整个堆或代,工作量不可拆分,导致停顿时间不可控。G1通过Region将工作量量化,基于统计模型估算回收N个Region所需时间,从而控制停顿(如MaxGCPauseMillis参数)。Region的独立性是预测模型的前提,而大对象(Humongous Object)占用连续Region会破坏这种独立性,导致G1退化为整堆回收,引发Full GC和长停顿。因此,避免大对象是保证G1高效运行的关键。
2025-12-23 14:28:59
916
原创 Docker 中的端口映射原理:为什么 Nginx 要 `listen 80`,而不是“随便写端口”
摘要 Docker环境下端口配置的关键在于容器内外端口映射的对应关系。裸机环境中进程直接监听操作系统端口,而Docker容器拥有独立网络空间,需要通过-p参数建立宿主机与容器的端口映射。Nginx的listen指令决定容器内部监听端口,必须与-p参数指定的容器端口一致,否则会导致连接失败。生产环境推荐容器内部固定使用80端口,通过Docker映射不同外部端口实现多服务部署。正确理解listen(容器内部服务监听)和-p(宿主机对外暴露)的职责划分,是保证Docker网络连通性的关键。
2025-12-23 11:15:38
844
原创 Spring Boot 的主要特性与传统 Spring 项目的区别
Spring Boot 是一个简化 Spring 应用开发的框架,相比传统 Spring 项目具有显著优势。它通过自动配置机制减少手动配置,内置 Web、JPA 等开箱即用功能,并集成嵌入式服务器,无需外部部署。此外,Spring Boot 提供 Actuator 监控功能,支持通过简单属性文件进行配置,而传统 Spring 需要复杂的 XML 配置和外部工具集成。这些特性使开发者能更专注于业务逻辑,大幅提升开发效率。
2025-12-21 10:54:34
894
1
原创 Redis Lua 脚本为什么天然具备原子性?
Redis Lua脚本的原子性源于Redis的单线程架构,整个脚本被视为一条不可分割的命令执行,确保脚本内的所有操作不会被其他客户端请求打断。这解决了高并发场景下的竞态问题,如库存扣减和一人一单等业务场景。相比MULTI/EXEC事务,Lua脚本提供更强的原子性保证且性能更优。但需要注意脚本不能跨Cluster节点执行,且过长的脚本会阻塞Redis服务。Lua脚本是Redis实现复杂原子操作的推荐方案。
2025-12-21 10:39:15
1041
原创 视图 vs 临时表:它们的差异、适用场景与性能优化
视图和临时表是数据库开发中两种常见但易混淆的对象。视图是SQL查询模板,不存储数据,仅封装查询逻辑,适合统一口径、权限控制和简化复杂查询;临时表则实际存储数据,作为中间结果缓存,适合性能优化、复杂计算和分步ETL处理。核心区别在于:视图提供逻辑抽象层,临时表提供物理数据缓存。视图侧重封装与安全,临时表侧重性能与中间处理。正确选择使用可显著提升SQL性能和系统可维护性。
2025-12-21 10:32:18
1319
原创 Java 17 新特性深度解析:记录类、密封类、模式匹配与增强的 switch 表达式对比 Java 8
Java 17 引入了多项重要特性,显著提升了开发效率和代码简洁性。记录类(Records)简化了数据对象的定义,自动生成构造方法和常用方法;密封类(Sealed Classes)增强了继承控制;模式匹配优化了类型检查和转换;增强的 switch 表达式支持直接返回值和 yield 语法。相比 Java 8,这些新特性减少了样板代码,提高了可读性和安全性,使 Java 语言更加现代化。
2025-12-20 11:41:36
1028
原创 CMS vs G1 GC 写屏障:拦截时机与漏标的根本原因
CMS和G1垃圾收集器采用不同的写屏障策略处理并发标记中的漏标问题。CMS通过增量更新(Incremental Update)拦截新增引用,当黑对象指向白对象时,将白对象重新标记为灰色,确保实时可达性。而G1使用SATB(Snapshot-At-The-Beginning)策略,拦截删除引用时记录旧引用,保证GC开始时对象快照的完整性。CMS关注"黑→白"新增引用的修补,G1则维护初始快照一致性,两种方法都能有效避免漏标,但实现原理和设计哲学不同。
2025-12-20 09:38:59
498
原创 深入解析 JVM 垃圾回收算法:经典 vs 新型 GC 算法
Java垃圾回收算法演进:从传统到现代 摘要: Java垃圾回收算法经历了从传统到现代的演进过程。传统算法包括标记-清除(存在内存碎片问题)、标记-整理(解决碎片但开销大)、复制算法(适合年轻代)和分代收集(区分不同生命周期对象)。现代算法如G1采用分区思想实现低停顿,ZGC和Shenandoah通过并发标记/整理实现毫秒级停顿,都基于三色标记法解决并发问题。随着JDK更新,垃圾回收技术不断优化,G1适用于可控停顿场景,而ZGC/Shenandoah更适合大内存低延迟系统,代表未来发展方向。不同算法各有优劣
2025-12-20 09:37:08
1037
原创 Java 静态代理 vs 动态代理:机制解析、优势对比与完整 Demo
本文对比分析了Java中的静态代理和动态代理模式。静态代理需要手动编写代理类,在编译期确定,虽然简单但扩展性差,容易导致代理类爆炸。动态代理(包括JDK动态代理和CGLIB)则在运行时自动生成代理类,通过统一拦截器复用增强逻辑,显著提高了扩展性和维护性。JDK动态代理基于接口,CGLIB可代理无接口类。动态代理在现代Java开发中应用更广泛,特别是Spring AOP等框架底层大量使用动态代理技术。两者根本区别在于代理类的生成时机和方式,动态代理因其可复用性和扩展性优势,成为大型系统和框架开发的首选方案。
2025-12-18 10:16:22
553
原创 Java 线程池预热(Warm-up)实战:开启与不开启到底差多少?
本文探讨了线程池预热在高并发系统中的重要性。冷启动会导致首批请求延迟飙升,原因包括线程创建、类加载、JIT编译等初始化操作。通过线程池预热(提前创建线程并执行轻量任务),可使系统进入"已加载、已编译、已就绪"状态。文章通过对比测试展示了预热效果:未预热时首次任务耗时55ms,预热后降至3ms。建议高并发系统、微服务扩容场景和对延迟敏感的接口都应采用预热策略。实现方式简单,只需调用prestartAllCoreThreads()并提交预热任务即可显著降低冷启动延迟。
2025-12-18 10:11:53
413
原创 MySQL 的 B+ 树 vs Redis 的跳表:区别在哪?为什么 MySQL 不用跳表?
MySQL和Redis在索引结构选择上的差异主要源于存储介质的不同需求。MySQL(InnoDB)采用B+树索引,针对磁盘存储优化,通过高扇出、低树高和叶子链表设计减少随机I/O,提升范围查询效率。而Redis使用跳表(SkipList)实现有序集合(ZSET),因其内存存储特性更注重实现简单性和操作效率。B+树严格平衡的特性更适合数据库对稳定性和I/O性能的要求,而跳表的概率平衡特性在内存环境中更具优势。两种结构虽然都能实现O(logN)查询,但B+树的页式组织更适合磁盘存储,而跳表的指针结构更适配内存操
2025-12-16 11:15:28
1241
原创 Java 线程池中 execute() 和 submit() 的区别(源码 & 实战全解析)
Java线程池execute()与submit()方法核心区别 execute()和submit()是Java线程池最常用的两个方法,主要差异在于: 功能定位 execute():仅执行任务,不关心结果 submit():管理任务,可获取Future返回值 核心差异 execute()直接抛出异常,submit()将异常封装到Future submit()支持任务取消、结果获取和批量管理 使用场景 execute()适用于日志记录等无需返回值的场景 submit()适用于需要结果汇总、异常处理的业务逻辑 本
2025-12-16 11:14:37
1007
原创 为什么在生产中不推荐使用 MySQL 的 TEXT 字段?
摘要: 在生产环境中,MySQL的TEXT字段可以使用,但需谨慎。TEXT字段易导致表膨胀、索引失效、查询性能下降等问题。适用场景包括仅存储内容(如新闻正文、评论内容)且不参与查询、排序或频繁更新的字段。实践规范包括:将TEXT字段拆分到冷表、避免核心流程表使用、不用LIKE搜索、优先使用VARCHAR替代。TEXT会引发缓存命中率下降、备份恢复慢、主从延迟等问题,因此核心业务表应避免使用,建议拆表或采用外部存储方案。
2025-12-15 14:25:33
879
原创 MySQL 中 UPDATE 语句的执行过程全解析
MySQL UPDATE操作执行流程详解:从SQL解析到事务提交,整个过程遵循"查找记录→加锁→写undo→修改内存页→redo prepare→写binlog→redo commit→释放锁"的核心链路。首先Server层解析SQL并调用InnoDB,InnoDB通过索引查找记录并加锁(行锁或间隙锁),记录undo日志保存旧值。随后修改Buffer Pool内存页,写入prepare状态的redo日志保证持久化。Server层写入binlog后,通过两阶段提交机制确保redo和binl
2025-12-15 13:56:53
1130
原创 Spring 循环依赖:为什么 B 拿到的 earlyProxyA 最终会变成 proxyA?
本文深入解析了Spring框架在循环依赖和AOP场景下的代理对象处理机制。当A和B相互依赖且A需要AOP代理时,Spring通过三级缓存机制:1)提前通过getEarlyBeanReference生成earlyProxyA存入二级缓存供B使用;2)在A初始化阶段通过wrapIfNecessary检查earlyProxyReferences避免重复代理;3)最终将earlyProxyA作为唯一代理对象存入一级缓存。这种设计既解决了循环依赖问题,又确保了AOP代理的唯一性和一致性。文章还对比了二级缓存的局限性,
2025-12-14 18:07:11
849
原创 深入解析 Spring 循环依赖:如何通过三级缓存解决 A ↔ B 的依赖问题
Spring循环依赖处理机制摘要 Spring通过"三级缓存+提前暴露Bean引用"机制解决部分循环依赖问题。能处理单例作用域且通过属性/Setter注入的循环依赖,如A依赖B且B依赖A的情况。 三级缓存结构: 一级缓存(singletonObjects):存放完全初始化后的成品Bean 二级缓存(earlySingletonObjects):存放提前暴露的半成品Bean引用 三级缓存(singletonFactories):存放生成早期引用的ObjectFactory 处理流程:当检测
2025-12-14 18:06:40
1450
原创 线程池下的 ThreadLocal:原理、串台、弱引用 key、以及 finally remove() 为什么是救命符
ThreadLocal 是 Java 中用于线程内共享上下文的重要工具,但也容易引发内存泄漏和上下文串台问题。本文深入解析 ThreadLocal 的工作原理,揭示其值实际存储在 Thread 对象的 ThreadLocalMap 中,通过弱引用管理 key 以防止内存泄漏,同时保持 value 强引用确保数据可用性。重点分析了线程池环境下不调用 remove() 方法会导致的串台问题,并提供了 100% 复现内存泄漏的示例代码。文章强调工程实践中必须 finally remove() 来避免上下文污染和内
2025-12-11 10:11:04
1026
原创 一篇搞懂 Java 四种引用:ReferenceQueue 实战 + ThreadLocalMap 为何 key 用弱引用
本文详细介绍了Java中的四种引用类型及其在垃圾回收中的作用: 强引用(Strong Reference):最常见的引用类型,只要存在强引用,对象就不会被GC回收。通过断开引用链(设为null)可使其被回收。 软引用(SoftReference):在内存充足时保留对象,内存紧张时会被GC回收,常用于缓存实现。通过内存压力测试可观察到回收过程。 弱引用(WeakReference):只要发生GC就会被立即回收,常用于ThreadLocal等场景。通过GC循环可稳定观察到回收结果。 虚引用(PhantomRef
2025-12-11 09:59:11
1052
原创 布隆过滤器参数深度解析:如何根据误判率计算位数组大小与哈希函数数量
布隆过滤器通过空间换时间的方式,在医疗等系统中高效防止缓存穿透问题。其核心参数是预计元素数量(n)和误判率(p),由此可计算位数组大小(m)和哈希函数数量(k)。例如存储10万患者ID、1%误判率仅需约117KB内存和6-7个哈希函数。实际应用中,Redisson等工具会自动完成这些计算,开发者只需设置n和p即可。布隆过滤器以极小内存换取高性能,有效保护数据库免受无效查询冲击,特别适合需要快速存在校验的场景。
2025-12-10 15:52:50
784
原创 搞懂布隆过滤器:原理详解 + Redisson 实战防缓存穿透
本文介绍了布隆过滤器的原理及其在电商系统中的应用。布隆过滤器是一种空间效率高、查询快速的概率型数据结构,通过多个哈希函数将元素映射到位数组中,用于判断元素是否存在集合中。其优点是占用空间小、查询速度快,缺点是存在误判率且不支持删除操作。在电商场景中,文章展示了基于Redisson的实现方案:启动时初始化布隆过滤器,商品详情页用它过滤无效SKU防止缓存穿透,并在新增商品时自动更新过滤器。该方案有效保护了数据库和缓存系统,同时保持高性能和低存储开销。
2025-12-10 15:47:00
733
原创 MySQL STORED 生成列(Generated Column)详解:让 SQL 变快的秘密武器
MySQL 8中函数判断会导致索引失效,严重影响查询性能。通过STORED生成列可解决此问题:它自动计算并存储派生字段(如是否工作日),支持索引创建,查询时直接使用索引而非全表扫描。相比VIRTUAL虚拟列,STORED更适合大数据量、高并发场景,可显著提升性能5-30倍。典型应用场景包括日期分类、金额区间等业务派生字段,结合维度表(dim_date)使用效果更佳。需注意STORED列不能手动更新,大表修改结构时需考虑线上压力。该方案是OLTP性能优化的重要利器。
2025-12-09 13:53:09
1089
原创 如何在 MySQL 中优雅统计“只算周一到周五”的到访数据?
本文介绍了医院信息系统中统计工作日数据的优化方法。针对常见的"只统计周一至周五"需求,分析了初级写法(WEEKDAY函数)导致索引失效、性能低下的问题,提出了两种企业级解决方案:1) 使用生成列(STORED)预先计算工作日标记并建立索引;2) 在数据仓库中构建日期维表(dim_date)关联查询。通过实际案例演示,优化后的查询能高效利用索引,避免全表扫描,显著提升性能,适用于大规模医疗数据分析场景。这些方法不仅适用于医疗系统,也可推广至其他需要工作日统计的业务场景。
2025-12-09 13:45:17
762
原创 如何在 Spring Boot 中集成 IP2Region 实现高效 IP 地址地理位置查询
摘要:本文介绍如何在Spring Boot项目中集成IP2Region库实现IP地址地理位置查询功能。主要内容包括:添加Maven依赖、配置数据库文件路径及IP版本、创建IP查询服务类初始化Searcher实例,以及通过REST控制器提供查询API。该方法支持IPv4/IPv6查询,能高效返回IP对应的国家、省份、城市等信息,适用于需要IP定位功能的Web应用开发。
2025-12-08 13:16:20
1246
原创 一文搞懂 MySQL LIMIT 深分页性能问题与优化实战
MySQL的LIMIT分页查询在执行时会扫描offset+count行数据,然后丢弃前offset行,返回剩余的count行。当offset很大时(如LIMIT 1000000,100),会扫描1000100行但仅返回100行,导致性能急剧下降。优化方案包括:1)使用主键范围分页(WHERE id>1000000 LIMIT 100);2)基于游标的分页(记录最后ID);3)子查询+JOIN方式。建议对大偏移量分页采用基于主键的范围查询,可显著提升性能。
2025-12-08 11:16:24
765
原创 避免 JOIN 灾难:为什么必须“小表驱动大表”?
摘要: 大表JOIN小表时,核心原则是小表驱动大表且JOIN字段需有索引,否则易引发性能问题(如全表扫描、大量随机IO)。MySQL采用嵌套循环(Nested Loop),驱动表越小、循环次数越少;被驱动表若无索引会导致灾难性扫描。优化方法包括:强制小表驱动(STRAIGHT_JOIN)、确保JOIN字段索引、过滤条件前置、避免数据类型不一致及复杂计算。案例显示,优化后性能可从分钟级提升至毫秒级。关键点:小表驱动、索引覆盖、执行计划监控。
2025-12-05 10:23:56
603
原创 子网掩码与网络规划全解析:从 /24 到 /21 的直观理解
摘要:子网掩码和CIDR是局域网规划的核心概念。子网掩码区分IP地址的网络号和主机号,如255.255.255.0表示/24(前24位网络号)。CIDR(如/24、/23)直观展示网络位数与主机位数的关系:/24支持254台设备,/23支持510台,/22支持1022台,/21支持2046台。网络规划应根据规模选择掩码:小型网络用/24,中型用/23,大型用/22或/21。但需注意,扩大子网会增加广播量,建议通过VLAN和三层交换机实现更专业的网络隔离与管理。
2025-12-05 10:07:55
982
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅