- 博客(118)
- 收藏
- 关注
原创 Java进阶(7) | 链路追踪入门:一个请求是怎么被“全程跟拍“的
本文介绍了链路追踪(Tracing)作为可观测性三大支柱之一的核心原理与价值。文章首先指出微服务架构下请求被分散到多个进程,传统日志和耗时排查手段失效的痛点。核心思想是为每个请求分配全局唯一的TraceId,类比快递单号,将分散在各服务的记录串联起来。接着详细阐述了Trace(一次完整请求的所有Span集合)与Span(一段有起止时间的操作)两个核心概念,并通过下单请求示例展示了Span树如何形成调用关系图,直观定位性能瓶颈。文章重点解释了上下文传播机制:进程内通过ThreadLocal传递追踪
2026-07-25 06:50:19
407
原创 Java进阶(6) | Grafana 搭建监控大盘:让指标“看得见“
本文介绍了Grafana在监控体系中的核心作用,强调其与Prometheus的分工:Prometheus负责数据存储与查询,Grafana负责数据可视化与告警。文章首先指出Prometheus自带界面仅适合临时查询,而Grafana能提供一屏多指标、自动刷新、多数据源等能力,适合日常监控。接着阐述了Grafana不存储数据,仅作为展示层实时从Prometheus读取数据。核心概念包括Data Source、Dashboard、Panel、Query和Variable,类比为报表制作流程。实践部分
2026-07-24 07:01:55
301
原创 Java全貌(5) | 监控指标入门:Micrometer + Prometheus
本文介绍了Java监控指标的基础知识,重点讲解Micrometer与Prometheus的集成使用。文章首先区分了日志与指标的不同作用,指出日志记录具体事件而指标提供聚合的实时数据,并介绍了可观测性的三大支柱:日志、指标和链路追踪。接着阐述了整体架构:Micrometer负责在Java代码中埋点维护指标,通过/actuator/prometheus端点暴露数据,Prometheus采用pull模式定时抓取,Grafana用于可视化。文章详细解释了Micrometer作为监控门面的作用,类比SLF
2026-07-23 08:06:33
499
原创 Java高并发底层原理(二十九)—— 从内存队列到可靠任务系统:数据库任务表与 MQ 如何选择
本文讨论了在Java高并发场景下,从内存队列升级到数据库任务表或消息队列(MQ)的必要性。内存队列仅将任务存储在JVM内存中,面临服务重启、宕机或多实例部署时任务丢失、状态不可知、无法共享等问题。数据库任务表通过将任务持久化到数据库,成为任务的事实来源,解决了任务可恢复性问题,支持状态记录(如CREATED、RUNNING、SUCCESS)和失败重试。在多实例环境下,通过带状态条件的原子更新(如将CREATED更新为RUNNING)实现任务抢占,避免重复执行,同时需结合幂等设计兜底重复执行带来的
2026-07-22 10:15:42
332
原创 Java进阶(4) | Spring Security + JWT:认证授权入门
本文介绍了Spring Security与JWT在Java项目中的认证与授权应用。首先区分了认证(你是谁)和授权(你能做什么)两个概念,并对比了传统Session方案与JWT方案的优劣:Session方案将用户信息存储在服务端,在分布式环境下需要共享Session(如Redis),而JWT将用户信息编码进token本身,服务端无状态,天然支持多机部署。JWT由Header、Payload、Signature三部分组成,前两部分为Base64编码(非加密),签名使用服务端密钥防止篡改。Spring
2026-07-21 06:59:15
255
原创 Java进阶(3) | Kubernetes 入门:为什么需要它,核心概念与实战
本文介绍了Kubernetes(K8s)的入门知识,包括其必要性、核心概念和实战部署。文章首先指出Docker Compose在单机多容器管理上的局限性,如无法自动重启、多机调度、自动扩缩容等,从而引出K8s作为容器编排工具的重要性。K8s的核心思想是声明式配置和自动调谐,用户只需声明期望状态,系统自动维持。接着介绍了四个核心概念:Pod(最小部署单元)、Deployment(管理Pod副本和更新)、Service(提供稳定访问入口)和Ingress(HTTP路由入口)。文章还简要说明了集群架构
2026-07-20 06:58:14
259
原创 Java进阶(2) | Docker 容器入门:从原理到打包部署
本文介绍了Docker容器的核心概念、常用命令以及如何将Spring Boot应用打包部署。首先,通过集装箱比喻解释了容器解决了应用环境一致性问题,并对比了容器与虚拟机的区别,指出容器更轻量、启动更快。接着,阐述了Dockerfile、镜像和容器三个核心概念及其关系。然后,列出了镜像和容器的常用命令,包括拉取、构建、运行、查看、停止和删除等操作,并解释了端口映射。重点部分展示了如何编写多阶段构建的Dockerfile来打包Spring Boot应用,以减小最终镜像体积。最后,介绍了Docker
2026-07-19 00:09:18
286
原创 Java进阶(1) | 微服务入门:从单体到 Spring Cloud 全家桶
本文是Java进阶系列中关于微服务入门的系统性介绍,旨在为初学者建立微服务架构的完整概念地图。文章首先对比了单体架构与微服务架构的优缺点,指出单体应用在团队变大、业务模块增多时会出现维护困难、扩展不灵活等问题,而微服务通过按业务拆分为独立部署的小应用来解决这些问题。但微服务也引入了服务发现、远程调用、负载均衡、配置管理、熔断降级、分布式事务、链路追踪等新挑战。文章随后以表格形式总览了这些核心问题及其常见解决方案(如Nacos、OpenFeign、Spring Cloud Gateway、Sent
2026-07-17 09:34:32
420
原创 Java高并发底层原理(二十八)—— 并发任务处理系统如何设计:从任务模型到 Worker 执行
本文介绍了单机内存版并发任务处理系统的设计原理与核心模型。文章首先指出文件解析、图片处理等耗时任务不适合在请求线程中同步执行,会导致接口响应变慢和线程阻塞。随后提出了解耦方案:请求线程只负责创建任务并提交,后台Worker线程负责执行。系统最小模型包含四个角色:Producer(任务生产者)、Task(任务对象)、Task Queue(有界阻塞队列)和Workers(工作线程)。文章详细阐述了Task建模的重要性,包括任务ID、类型、状态、重试次数等属性;解释了为何必须使用有界队列(如Array
2026-07-17 06:43:46
263
原创 Java高并发底层原理(二十七)—— 死锁、活锁与线程饥饿是如何发生的
本文深入分析了Java高并发编程中程序“卡住”的三种典型问题:死锁、活锁与线程饥饿。文章首先指出,线程卡住并非程序崩溃,而是执行条件未被满足,并给出了三种问题的表面现象与本质原因对比表。接着,通过两把锁的经典代码示例,详细解释了死锁的发生机制:多个线程各自持有部分资源并互相等待,形成循环等待环。死锁的四个必要条件(互斥、请求并保持、不可剥夺、循环等待)被逐一说明,其中循环等待是最易从代码层面控制的关键。文章重点介绍了两种避免死锁的实用方法:一是固定加锁顺序,通过让所有线程按全局统一顺序申请锁来破
2026-07-17 06:42:54
312
原创 Java高并发底层原理(二十六)—— ForkJoinPool 如何通过工作窃取执行任务
本文深入解析了ForkJoinPool通过工作窃取机制执行任务的核心原理。首先介绍了ForkJoinPool的四个关键角色:ForkJoinPool(执行器)、Worker(工作线程)、本地双端队列(每个Worker私有的任务缓冲区)和ForkJoinTask(可拆分的任务对象)。与普通线程池不同,ForkJoinPool专为可拆分合并的递归任务设计。其核心工作窃取机制是:每个Worker拥有自己的本地双端队列,当前Worker拆分的子任务通过fork()放入本地队列,优先执行自己的任务;其他空
2026-07-16 09:19:32
300
原创 Java高并发底层原理(二十五)—— LockSupport 如何挂起和唤醒线程
本文深入解析了Java并发工具LockSupport的核心机制。LockSupport不是锁,也不维护等待队列,而是提供线程挂起(park)和唤醒(unpark)的底层能力。其核心是为每个线程关联一个permit(许可证),permit最大为1,类似0/1状态机。park()尝试获取permit,没有则阻塞;unpark()发放permit,可提前于park()执行,但多次调用不会累加。文章通过多个示例展示了park/unpark的基本用法、unpark先于park的特性、permit不累加的特
2026-07-16 09:18:11
296
原创 Java高并发底层原理(二十四)—— 线程中断如何让任务安全停止
本文深入探讨了Java线程中断机制的原理与最佳实践,强调中断是一种协作式停止机制,而非强制终止。文章指出,线程中断的核心是外部线程通过interrupt()方法发出停止请求,将目标线程的中断标记设为true,而任务本身需要在合适的位置检查该标记并决定是否退出。对于运行中的任务,应通过循环条件主动检查Thread.currentThread().isInterrupted();对于阻塞中的任务(如BlockingQueue.take()),阻塞方法会抛出InterruptedException来响
2026-07-15 09:00:04
382
原创 Java高并发底层原理(二十三)—— BlockingQueue 如何协调生产者和消费者
本文深入解析了Java并发包中BlockingQueue的设计原理与实现机制。首先,BlockingQueue在普通线程安全队列基础上增加了等待语义,通过Condition机制协调生产者和消费者在队列空或满时的阻塞与唤醒。文章详细对比了四类操作策略(抛异常、返回特殊值、一直等待、超时等待)的适用场景,强调put()和take()在生产者消费者模型中的核心地位。随后,重点剖析了ArrayBlockingQueue和LinkedBlockingQueue两种典型实现:ArrayBlockingQue
2026-07-15 08:59:01
374
原创 Java高并发底层原理(二十二)—— ConcurrentHashMap 为什么能支持高并发访问
本文深入解析了ConcurrentHashMap支持高并发访问的底层原理。首先指出普通HashMap在多线程写入时因缺乏并发控制会导致数据丢失,而Hashtable通过全局锁保证安全但性能差。ConcurrentHashMap的设计核心是缩小锁粒度:JDK 1.7采用Segment分段锁,JDK 1.8进一步优化为桶级锁。具体实现上,当桶为空时使用CAS原子操作插入新节点,避免加锁;当桶非空时仅锁住桶头节点,保证同一桶内串行写入,不同桶间并行操作。对于读操作,get方法大多无需加锁,依赖vola
2026-07-14 08:07:02
525
原创 Java高并发底层原理(二十一)—— 无锁设计、ABA 与 LongAdder
本文介绍了Java高并发中的无锁设计原理,核心思想是线程竞争失败后不进入阻塞队列,而是通过重试、校验或换位置继续尝试。首先介绍了CAS(Compare-And-Set)机制,它通过原子性的比较并设置操作配合循环实现无锁更新,适合计数器累加等短操作。但CAS并非没有成本,高竞争下会导致CPU时间浪费和缓存行失效问题。接着介绍了Copy-On-Write(写时复制)策略,通过复制副本并在新对象上修改后一次性替换共享引用,避免读线程看到中间状态。文章强调了使用不可修改结构和快照对象(ConfigSna
2026-07-14 08:05:53
250
原创 Java高并发底层原理(二十)—— ReentrantReadWriteLock 与 StampedLock
本文深入解析了Java中ReentrantReadWriteLock与StampedLock的底层原理。首先通过对比互斥锁与读写锁,阐述了读写锁在并发场景下的优势:读操作之间可以共享,而写操作独占,从而提升并发性能。文章详细介绍了ReentrantReadWriteLock的内部实现机制,重点分析了其如何通过AQS中的单个int类型state变量同时表示读锁和写锁状态——将32位state拆分为高16位表示读锁总数、低16位表示写锁重入次数。同时,文章解释了写锁和读锁的申请规则:写锁排斥任何读锁
2026-07-13 06:57:46
719
原创 Java高并发底层原理(十九)—— AQS 独占与共享模式如何完成排队与唤醒
本文深入解析了AQS(AbstractQueuedSynchronizer)在Java高并发中的核心机制,重点阐述了独占模式与共享模式下线程的排队与唤醒原理。AQS作为构建同步器的基础框架,通过维护一个int类型的state变量表示同步状态,具体语义由子类(如ReentrantLock、Semaphore)定义。获取资源时,线程先尝试tryAcquire(),成功则继续执行,失败则包装为Node节点加入双向等待队列。队列采用CLH锁变体,通过CAS操作安全插入队尾,并利用前驱节点的waitSta
2026-07-13 06:56:57
305
原创 Java高并发底层原理(十八)—— ThreadLocal 的线程隔离与线程池问题
本文深入解析了ThreadLocal实现线程隔离的原理及其在线程池中引发的问题。ThreadLocal的核心思想是将共享变量变为线程私有变量,其底层实现并非将数据存储在ThreadLocal对象中,而是每个Thread对象内部维护一个ThreadLocalMap,以ThreadLocal实例为key存储对应的value,从而实现线程间数据隔离。文章指出,在线程池场景下,由于线程会被复用,ThreadLocal数据不会随任务结束而自动销毁,可能导致两个主要问题:一是数据串用,即后续任务可能读取到前
2026-07-12 08:06:44
339
原创 Java高并发底层原理(十七)—— CompletableFuture 如何处理异步结果与异常
本文深入探讨了CompletableFuture在异步任务中处理异常的核心机制。首先解释了异步任务中的异常不会直接抛给调用线程,因为工作线程和调用线程不同,异常只能通过共享的Future对象保存完成状态。接着分析了Supplier接口不能直接抛出受检异常的原因,并提供了两种处理方式:包装成运行时异常继续传播,或捕获后返回默认值使任务正常完成。文章详细阐述了异常沿任务链传播的规则,指出普通后续阶段(如thenApply)在前一步异常完成时会跳过执行,异常会继续向后传播。重点介绍了两种异常处理方法:
2026-07-12 08:05:39
260
原创 Java高并发底层原理(十六)—— CompletableFuture 如何编排多个异步任务
本文介绍了Java中CompletableFuture如何解决普通Future在编排多个异步任务时的不足。普通Future需要调用线程主动调用get()等待结果,再手动提交下一个任务,导致代码阻塞且难以描述任务间的依赖关系。CompletableFuture允许提前描述任务依赖,让前一阶段完成后自动触发下一阶段,无需调用线程反复等待。文章详细说明了创建任务链起点的方法:runAsync()用于无返回值的任务,supplyAsync()用于有返回值的任务。接着介绍了阶段完成后三种后续操作:then
2026-07-11 06:40:44
699
原创 Java高并发底层原理(十五)—— FutureTask 如何保存异步任务的结果和异常
本文介绍了Java中FutureTask如何保存异步任务的结果和异常。首先指出Runnable的run()方法无返回值,无法满足需要返回结果的任务场景。为此,Java引入了Callable接口表示有返回值的任务,Future接口作为异步结果的凭证,提供get()、cancel()、isDone()等方法。FutureTask实现了RunnableFuture接口,同时具备Runnable和Future的特性,既可以被工作线程执行,又可以被提交线程查询结果。在线程池中,submit()方法将Cal
2026-07-11 06:39:59
292
原创 Java高并发底层原理(十四)—— 线程池如何复用和调度线程
本文深入解析Java线程池如何复用和调度线程,以解决为每个任务创建线程带来的资源消耗问题。文章首先指出线程创建、销毁的成本以及过多线程导致的上下文切换和内存压力,引出线程池的核心思想:将任务与线程分离,通过维护一组可复用的工作线程来执行不断到来的任务。接着详细阐述了ThreadPoolExecutor的核心参数(corePoolSize、maximumPoolSize、keepAliveTime、workQueue、handler)及其作用,并解释了新任务到来时的调度流程:先核心线程,再任务队列
2026-07-10 08:52:09
332
原创 Java高并发底层原理(十三)—— Object Monitor 如何实现对象锁与线程等待
本文深入解析了Java中synchronized关键字与Object Monitor的关系,以及如何实现对象锁与线程等待。文章首先阐明任意Java对象都可作为锁,但实际竞争的是JVM管理的Monitor,Monitor记录锁状态、持有线程、重入次数及等待线程集合。接着强调多个线程必须使用同一锁对象才能实现互斥,并对比了synchronized用于代码块、实例方法和静态方法时的不同锁对象。文章解释了synchronized的可重入性,即同一线程可多次进入同一锁保护的代码,Monitor会记录重入次
2026-07-10 08:51:27
257
原创 Java高并发底层原理(十二)—— Semaphore 如何控制并发线程数量
本文详细介绍了Java并发工具Semaphore的原理与使用。Semaphore通过许可证机制控制同时访问受限资源的线程数量,初始许可证数量在构造时指定。线程通过acquire()获取许可证(state减少),通过release()归还(state增加),基于AQS的state字段实现。当许可证不足时,线程进入AQS等待队列暂停,待其他线程释放后被唤醒重新竞争。acquire()和release()均需CAS保证原子性,防止并发问题。Semaphore采用AQS共享模式,允许多个线程同时获取许可
2026-07-09 00:10:10
258
原创 Java高并发底层原理(十一)—— CountDownLatch 如何等待多个线程完成
本文介绍了Java并发工具CountDownLatch的原理与使用。CountDownLatch用于解决一个线程需要等待多个任务完成后才能继续执行的问题,它基于AQS实现,使用state保存剩余计数。创建时传入初始计数值,每调用一次countDown(),计数通过CAS循环递减,保证并发安全。调用await()的线程会检查state,若state>0则进入等待队列暂停,当state减为0时,所有等待线程通过共享模式被唤醒。CountDownLatch是一次性闸门,计数只能减少不能重置,state
2026-07-09 00:08:56
338
原创 Java高并发底层原理(十)—— Condition 如何实现线程等待与通知
本文深入探讨了Java并发编程中Condition接口的原理与使用。文章首先指出,互斥锁仅解决线程竞争问题,但无法处理业务条件不满足时的等待场景。以生产者-消费者模型为例,消费者获取锁后若队列为空,不能直接取数据,也不能空转等待。Condition通过await()和signal()方法解决了这一难题:await()使线程释放锁并进入条件等待队列,signal()通知等待线程条件可能已变化。文章强调,await()必须在持有锁时调用,以确保条件检查与等待操作的原子性;signal()应在修改条件
2026-07-08 00:22:25
292
原创 Java高并发底层原理(九)—— ReentrantLock 为什么能够实现互斥
本文深入解析了ReentrantLock实现互斥的底层原理。首先指出互斥锁需要一个可被竞争的状态位(state),并通过CAS原子操作确保多个线程同时修改状态时的安全性。接着说明仅记录state不够,还必须记录当前持锁线程(owner)以防止非持有者错误释放锁。在此基础上,文章解释了可重入机制:当申请锁的线程已是owner时,允许再次进入并将state扩展为重入计数,释放时每次unlock只减少一次计数,直到state归零才真正释放锁。文章还指出unlock通常不需要CAS,因为持锁阶段只有ow
2026-07-08 00:20:23
486
原创 Java高并发底层原理(七)volatile 到底解决了什么问题
volatile 解决的是共享变量的可见性和有序性问题,可以让一个线程的写入被其他线程可靠观察到,并限制相关指令重排。但它不提供互斥,不能保证 count++ 等复合操作的原子性。它适合状态标记、配置发布、完成通知等简单发布场景。
2026-07-07 00:06:09
573
原创 Java高并发底层原理(八)—— Java 内存模型到底规定了什么
JMM 规定多线程读写共享变量时,哪些结果被允许、哪些结果必须排除。它通过 program order、synchronizes-with 和 happens-before 建立可见性与有序性保证;没有同步关系时,共享读写可能产生数据竞争,程序不能依赖偶然正确的运行结果。
2026-07-07 00:04:19
644
原创 Java高并发底层原理(六)—— 多核 CPU 如何保持缓存一致
本章讲多核CPU缓存一致性:数据以CacheLine为单位存在多级缓存副本,通过MESI协议在各状态间切换并通过失效与所有权转移保证一致性。CPU写入在缓存中完成并延迟写回内存。CAS依赖CPU原子读改写CacheLine独占权限实现比较交换。高竞争导致缓存失效与伪共享,引出LongAdder分散热点优化。
2026-07-06 08:56:56
437
原创 Java高并发底层原理(五)—— CAS 为什么能够在不加锁的情况下更新共享数据
本文讲CAS:通过当前值、预期值、更新值原子比较无锁更新,失败重试CAS。AtomicInteger基于CAS做原子自增,避免synchronized竞争。CAS属于乐观并发,低竞争,高竞争空转,涉及ABA问题、版本号,用于单值或引用更新,不适合复杂组合操作。
2026-07-06 08:53:43
397
原创 Java高并发底层原理(四)—— synchronized 为什么会影响性能
本章说明 synchronized 的性能成本主要来自锁竞争,而不是关键字本身。无竞争时开销较低;竞争激烈时,线程会等待、阻塞、唤醒并发生上下文切换,降低吞吐量。临界区过大、锁粒度过粗、线程过多或将 IO 放入锁内,都会加重性能问题。优化时应在保证业务一致性的前提下缩小锁范围、合理控制锁粒度。
2026-07-05 09:10:55
613
原创 Java高并发底层原理(三)—— synchronized 为什么能够保证线程安全
摘要 本章探讨了synchronized如何保证线程安全。核心机制是将复合操作(如count++)放入临界区,通过对象锁实现互斥访问。实例同步方法锁的是this对象,静态同步方法锁的是对应的Class对象,而同步代码块可以灵活指定锁对象。关键点包括:1)互斥性确保同一时刻只有一个线程能执行临界区代码;2)锁与对象绑定,不同对象对应不同锁;3)三种写法(实例方法、静态方法、代码块)本质相同,区别在于锁对象和临界区范围。正确选择锁对象是保证线程安全的关键。
2026-07-05 09:03:53
442
原创 Java高并发底层原理(二)—— 为什么 count++ 会出错
本文通过一个计数器示例揭示了多线程环境下count++操作出错的原因。核心问题在于count++实际上包含读取、计算和写入三个步骤,这些步骤不具备原子性,在多线程并发执行时可能被其他线程打断,导致丢失更新问题。文中详细分析了竞态条件的形成机制,指出判断线程安全需要考察共享状态、修改行为和操作原子性三个关键因素。文章最后强调,并发问题的本质在于非原子复合操作与共享可变状态的交互,为后续探讨解决方案奠定了基础。
2026-07-04 08:30:16
283
原创 Java高并发底层原理(一)—— 计算机是如何执行 Java 程序的
本文摘要: 第1章探讨了Java程序的执行过程,从源代码到CPU执行的完整链路。重点内容包括:1)Java程序通过JVM转换为字节码并由操作系统和CPU执行;2)现代CPU采用多核设计以提高性能,但需要线程机制来利用多核资源;3)CPU通过寄存器、多级缓存优化执行效率;4)JVM使用Heap和Stack分别存储共享对象和线程私有数据;5)多线程共享Heap对象时可能引发线程安全问题。本章为理解Java并发编程奠定了基础,强调程序执行的整体模型比具体API更重要。
2026-07-04 08:28:59
367
原创 Java基础(番外) | Kafka 入门:分区、副本与消费者组原理
本文介绍 Kafka 的核心原理与基本使用。Kafka 本质上是分布式持久化日志系统,通过分区实现并行处理,依靠顺序写磁盘、页缓存、零拷贝及批量压缩获得高吞吐。消息在分区内有序,可通过 key 保证同一业务数据进入同一分区。消费者组内由多个消费者分担分区,组间则独立消费完整消息流;Offset 用于记录各组消费进度。副本、Leader、Follower、ISR 与 acks 参数共同保障数据可靠性。文章还对比了 Kafka 与 RabbitMQ 在存储模型、消费方式、吞吐量和适用场景上的差异。
2026-07-03 10:18:44
883
原创 Java基础(番外) | 消息队列入门:为什么用、怎么用、踩坑点
本文介绍消息队列的作用与基本使用:通过解耦、异步和削峰填谷改善系统协作,并以 RabbitMQ 说明生产者、交换机、队列、绑定及消费者的消息流转。同时讲解消息丢失、重复消费、顺序性等常见问题,以及确认机制、持久化、手动 ACK、幂等和死信队列等解决思路。
2026-07-03 10:15:28
348
原创 Java基础(番外) | Tomcat 与 Servlet:Spring Boot 背后的请求处理流程
本文介绍 Tomcat 与 Servlet 的核心概念及 Spring Boot 中 HTTP 请求的处理流程,讲解 Servlet 生命周期、Tomcat 容器架构及请求从浏览器到 Controller 的完整执行链路;重点比较 Filter 与 Interceptor 的区别及适用场景,分析 Spring Boot 内嵌 Tomcat 的运行机制,并介绍常用服务器配置与线程池参数,帮助理解 Spring MVC 底层原理,为 Web 开发、性能优化与问题排查奠定基础。
2026-07-02 06:49:56
472
原创 Java基础(24) | MySQL 原理与优化:事务、存储引擎、索引与锁
本文系统介绍 MySQL 核心原理与性能优化,涵盖事务 ACID、隔离级别及并发问题,分析 InnoDB、MyISAM 等存储引擎特点;重点讲解 B+Tree 索引结构、聚集索引、联合索引、最左前缀原则及 EXPLAIN 执行计划,结合 SQL 优化、锁机制、视图、触发器和 SQL 执行顺序,帮助理解 MySQL 底层机制,提升数据库设计、查询优化与高并发场景下的问题排查能力。
2026-07-02 06:47:37
444
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅