自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(176)
  • 问答 (2)
  • 收藏
  • 关注

原创 智能SQL生成:后端技术与LLM的完美结合

如果各位有关注一些技术文章,难免会注意到这几年有一个词非常火,没错这就是“大模型”!那大模型是什么?有什么用呢?“大模型”是可以指任何规模较大、参数众多的机器学习模型,不仅限于自然语言处理(NLP),也可以包括计算机视觉、语音识别等其他领域的模型。大模型的特点是它们通常需要大量的数据来训练,以及相对较大的计算资源。大模型的用途十分广泛,在很多领域都有不错的应用价值:自然语言的生成和理解:大模型可以根据用户的问题生成连贯的文本回答、或是总结某些文章。ChatGPT就是一个不错的例子。图像的处理。

2024-02-25 18:20:38 488

原创 如何用克鲁斯卡尔算法求解最小生成树?

克鲁斯卡尔(Kruskal)算法也是求连通网的最小生成树的另一种方法。关于最小生成树相关概念不了解的可以看——Prim算法:如何快速求解最小生成树?-CSDN博客对图的所有边按照权值大小进行排序。将边添加到最小生成树时,如果当前最小权值的这条边添加进去,没有导致形成回路,那么就把边添加进树中。否则,不将边添加进树中,继续遍历下一条边。Kruskal算法和Prim算法有什么区别?Kruskal算法是基于边进行的贪心算法,而Prim算法是基于节点进行的贪心算法。

2023-12-29 16:52:05 1037

原创 Prim算法:如何快速求解最小生成树?

Prim算法是图论中的一种算法,可在加权连通图里搜索最小生成树。最小生成树,简称MST。是给定一个带权的无向联通图,如何选取一颗生成树,使树上所有边权的总和为最小,这个树就叫最小生成树。N个顶点,一定有N-1条边包含全部顶点N-1条边都在图中这个算法的常见用途就是在包含n个顶点的连通图中,找出只有(n - 1)条边包含所有n个顶点的连通子图,也就是最小生成树。

2023-12-28 07:00:00 980

原创 完蛋!我被ConcurrentHashMap源码包围了!(一)

是一个线程安全的HashMap,在JDK1.7与JDK1.8,无论是实现还是数据结构都会有所不一样。想学学习一个类的源码,就必须由浅入深,先从构造方法开始学习。触发扩容机制的触发,主要涉及两个方法``treeifyBin。将一个键值对放进Map的时候,我们通常调用。在进入源码学习之前,先回忆一下。简单使用如上,不过多赘述。tryPresize`方法。对于取值,通常都是通过。一样的面试高频考点。

2023-11-25 17:17:07 225

原创 被面试官问到分布式ID,别再傻乎乎只会答雪花算法了...

在分布式系统中,通常都需要对大量数据和消息进行唯一标识,这个表示通常被称为分布式ID。分布式ID是用于识别不同实体或数据对象的,这就要求分布式ID必须具有全局唯一性,不能出现重复的ID。并且,由于在复杂的分布式系统下,分布式ID使用的场景很多,这就要求分布式ID的生成速度应该足够快,并且对本地资源消耗小。除此之外,生成分布式ID必须是高可用的,因为分布式ID关联着众多系统,必须要求分布式ID的生成的服务可用性无限趋向于100%。

2023-10-13 21:07:47 2170

原创 【Seata】深入解读分布式事务解决方案

事务是数据库操作的一个逻辑单位,可以是一个或多个数据库操作的集合,在一个事务里,要么所有操作都执行成功,要么所有操作都不执行。本地事务分布式事务Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。Seata也是从两段提交演变而来的一种分布式事务解决方案,提供了ATTCCSAGA和XA等事务模式。XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入TCC模式:最终一致的分阶段事务模式,有业务侵入AT模式。

2023-10-01 17:48:35 297

原创 【JUC】一文弄懂@Async的使用与原理

在Spring3.X的版本之后,内置了@Async解决了多个任务同步进行导致接口响应迟缓的情况。使用@Async注解可以异步执行一个任务,这个任务的返回值必定为null,所以在使用@Async推荐返回值为NULL。那么该如何使用@Async开启一个异步任务呢?:启动类上开启异步模式@Async:需要异步处理的方法@Service@Async需要注意的是,@Async的异步任务是基于AOP实现的,如果是自调用的情况下,@Async是不会生效的喔。

2023-09-30 12:12:25 1724 1

原创 探索状态驱动开发的奇妙世界——Cola-StateMachine的介绍与使用

前面接受了Spring实现的状态机,这个状态机的优点在于功能很完备,缺点也是功能十分完备。完备到什么程度了,提供了状态机的高级玩法,比如状态的嵌套、状态的并行、子状态机等等。但是在开发中我们并不需要这些。除此之外,就是性能差的问题,包括但不仅限于在内的所有开源状态机都是有状态的,也就意味着状态机记住先前的状态和输入,以便在进行状态转换时使用这些信息作出决策。这就导致了这些有状态的状态机出现了线程安全的问题。而我们的系统往往是分布式多线程的,所以为了解决线程安全问题,我们不得不每次都要build一个实例。

2023-09-19 07:31:13 1981

原创 状态管理艺术——借助Spring StateMachine驭服复杂应用逻辑

在开发中,无时无刻离不开状态的一个概念,任何一条数据都有属于它的状态。比如一个电商平台,一个订单会有很多状态,比如待付款、待发货、待收货、完成订单。而这其中每一个状态的改变都随着一个个事件的发生。比如将商品下单但未付款,那么订单就是待付款状态,当触发支付事件,那么订单就能从待付款状态转变未待发货状态,以此类推随之对应的事件就是发货、收货。其二,状态的流动是固定了的。也就是说,待付款状态的下一个状态只能是待发货状态,不能直接转化为待收货状态。这种由待付款直接转变未待收货的状态是非法的,是程序不允许的。

2023-09-15 20:42:25 1528 4

原创 【RabbitMQ】掌握高级特性,为你的应用带来无限可能!

MQ指的是消息队列,而消息队列是一种应用程序之间进行异步通信的机制,常用于分布式系统中传递消息和实现解耦。同时,MQ也是一种先进先出的数据结构,消息会按照进入MQ的顺序依次被消费者消费。在开发中,MQ的应用应用场景包含但不限于下面的几种。

2023-09-03 06:00:00 297 5

原创 【企业方案】如何在海量数据中找到热点Key(附JdHotKey解决方案)

如何在海量数据找到热点Key???这时候难免有人回答“这不简单,在同一秒内访问达到一定阈值的Key,这些就是热点Key,然后我们将这些Key对应的值缓存到像Redis这样的缓存中,下次访问的时候如果缓存命中直接从缓存获取不就可以了了么?话是这样说,但是这里有一个前提,就是身为程序员的你在编写代码的时候已经预知了哪些Key会是热点Key,所以才会放进缓存。这样的操作适合于双十一这样的高并发大场景,因为双十一的商品肯定会被大量用户访问,所以放进缓存可以减少大量的MySQL压力。而。

2023-08-03 11:15:14 758 5

原创 【Spring】深入解析Spring事务:揭秘数据完整性背后的强大引擎

在MySQL中,事务是指一组数据库操作的集合,这些操作要么全部成功提交,要么全部回滚。事务可以确保数据的一致性和完整性,并提供并发控制机制,以防止数据的损坏或者丢失。而在Spring中,Spring提供Spring事务机制,用于管理数据库操作或其他资源的一致性和完整性。它允许开发者在应用程序中定义和控制事务,以保证数据的正确处理。

2023-07-31 15:25:06 177

原创 【SpringBoot】SpringBoot的自动配置源码解析

SpringBoot相对于SSM来说,主要的优点就是简化了配置,不再需要像SSM哪有写一堆的XML配置,这些XML配置在大项目上会成为一种累赘,使得后期项目难以维护。其实是spring底层注解,意思就是根据不同的条件,来进行自己不同的条件判断,如果满足指定的条件,那么配置类里边的配置才会生效。注解的作用是将当前类所在的包以及子包作为自动配置的包路径,以便让SpringBoot能够自动加载和处理这些组件的配置。这个方法的返回值是候选的配置类,经过处理和筛选后的自动配置类列表以及排除列表。

2023-07-13 10:22:00 945 8

原创 【MapStruct】还在用BeanUtils?不如试试MapStruct

MapStruct是一个Java注解处理器,它可以简化Java bean之间的转换。它使用基于生成器的方法创建类型安全的映射代码,这些代码在编译时生成,并且比反射更快、更可靠。使用MapStruct可以避免手动编写大量重复的转换代码,从而提高生产力和代码质量。MapStruct通过使用注解,在源代码中指定映射规则,MapStruct可以自动生成转换器代码。MapStruct支持各种转换场景,包括简单类型、集合、继承、日期、枚举、嵌套映射等等。

2023-06-02 21:47:26 496

原创 【JUC进阶】详解synchronized锁升级

是一个悲观锁,可以实现线程同步,在多线程的环境下,需在操作同步资源的时候先加锁,避免共享资源出现问题。因为加锁可以使得一个线程在一个时间点内只有一个线程可以访问,这样增加了安全性。但是这样却损失了程序的执行性能,因为在加锁、抢夺锁、释放锁需要从用户态切换成内核态,属于操作系统层面的,因此比较消耗性能。无锁状态偏向锁状态轻量级锁状态重量级锁状态。这几个状态会随着竞争情况逐渐升级。可以用在实例方法、静态方法、代码块上修饰实例方法,对当前实例对象this加锁修饰静态方法,对当前类的Class对象加锁。

2023-04-12 12:44:46 482 1

原创 【设计模式】软件设计原则以及23种设计模式总结

"设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任在他的著作《建筑模式语言:城镇、建筑、构造》中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。1990年软件工程界开始研讨设计模式的话题,后来召开了多次关于设计模式的研讨会。直到1995 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)

2023-04-06 17:12:42 584 1

原创 【Redis进阶】Redis数据结构

Redis常用的数据结构为String,List,Hash,Set,Sorted Set。但这只是我们在用的时候键值对的表现形式,他们底层真正使用的数据结构为简单动态字符串,双向链表,压缩列表,哈希表,跳表和整数数组在 Redis 3.0 版本中 List 对象的底层数据结构由「双向链表」或「压缩表列表」实现,但是在 3.2 版本之后,List 数据类型底层数据结构是由 quicklist 实现的;

2023-04-02 13:36:31 600

原创 【JavaSE】final、finally 和 finalize 有什么区别?

在上述代码中,try块包含可能会引发异常的代码,catch块包含捕获异常并执行适当的处理代码的语句。"finally"是Java中的一个关键字,用于定义在try-catch块之后执行的代码块。方法是一个特殊的方法,它被用来在对象被垃圾回收之前进行一些清理操作。总之,finally关键字用于定义始终执行的代码块,以确保必要的清理操作可以在任何情况下都会被执行。方法执行期间,该对象被重新引用了,那么这个对象就不再是垃圾对象了,即它被“复活”了。具体来说,当一个对象变成垃圾对象时,JVM会调用该对象的。

2023-03-31 15:57:46 389 1

原创 【JUC进阶】从源码角度万字总结ReentrantLock与AQS

是一个互斥锁,能够实现共享数据做互斥同步,这样在同一个时刻保证了只有一个线程能执行某个方法或者是某个代码块。同时,也是一个可重入锁,能够保证一个线程能够对临界共享资源进行重复加锁。对于互斥锁,JDK中还提供了一种实现,两种锁的区别如下锁实现机制对象头监视器模式依赖 AQS灵活性不灵活支持响应中断、超时、尝试获取锁释放锁形式自动释放锁显示调用 unlock()支持锁类型非公平锁公平锁 & 非公平锁条件队列单条件队列多个条件队列是否支持可重入支持支持可见,是要比。

2023-03-22 11:27:27 525

原创 【JavaSE】泛型中的通配符

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。在定义泛型类、泛型方法、泛型接口的时候会经常碰到很多泛型通配符,比如 T,E,K,V 等等。?表示不确定的 java 类型,用作 参数类型、字段类型、局部变量类型,有时作为返回类型(但请避免这样做)

2023-03-21 22:48:08 526

原创 【JUC进阶】一文深度讲解CAS

在JDK5之前,可以通过synchronized或Lock来保证高并发的业务场景下的线程安全,但是synchronized或Lock都属于互斥锁的方案,互斥锁所带来的比较重量级、加锁、释放锁都会带来性能上的损耗。于是,就出现了CAS机制实现无锁的解决方案,CAS和乐观锁类似,CAS可以达到非阻塞同步的方式来保证线程安全。CAS是现代CPU广泛支持的一种对内存中共享数据进行操作的一种特殊指令这个指令可以对内存中的共享数据做原子的读写操作。

2023-03-20 05:00:00 591

原创 【JUC进阶】如何优雅地处理线程池异常?

在开发中,我们经常使用线程池,会将不同的任务提交到线程池中,但是如果任务出现了异常,会发生什么呢?怎么获取到异常信息来解决异常?提交任务时,即使任务出现异常也不会打印异常信息,这是不友好的,这样开发者就不知道程序是否有异常。是一个处理线程内发生的异常的方法,参数为线程对象t和异常对象e。方法中,如果出现了异常,不会将异常往外抛,则是将异常设置给。里面把异常吞了,根本不会跑出来异常,因此也不会有异常进入到。提交的异常的时候,需要进行额外的处理,也就是判断。方法里面,将异常吞掉了,并没有抛出异常,因此在。

2023-03-19 16:17:50 1053 1

原创 【JUC进阶】如何合理设置线程池核心线程数?

线程池(Thread Pool)是一种基于池化思想管理线程的工具,线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。因此,线程池的参数的合理化就会显得很重要了。如果核心线程数设置偏小,那么会大量抛出,触发接口降级条件。

2023-03-18 20:57:04 1797

原创 【Redis进阶】一文搞懂Redisson的看门狗机制底层实现

看门狗机制是Redission提供的一种自动延期机制,这个机制使得Redission提供的分布式锁是可以自动续期的。看门狗机制提供的默认超时时间是30*1000毫秒,也就是30秒如果一个线程获取锁后,运行程序到释放锁所花费的时间大于锁自动释放时间(也就是看门狗机制提供的超时时间30s),那么Redission会自动给redis中的目标锁延长超时时间。在Redission中想要启动看门狗机制,那么我们就不用获取锁的时候自己定义leaseTime(锁自动释放时间)。如果自己定义了锁自动释放时间的话,无论是通过。

2023-03-17 09:57:23 18127 7

原创 【JVM】类加载的全过程

在Java语言中,每个类或接口都会被编译器编译程一个个class字节码文件。类加载则是将这些class字节码文件的二进制数据读入到内存中,并且对数据进行校验、解析、初始化。最终,每一个类都会在方法区保存一份它的元数据,在堆中创建一个与之对应的Class对象。类的生命周期需要经历7个阶段,分别是加载、验证、准备、解析、初始化、使用、卸载类的加载过程则是前面5个阶段,分别是加载、验证、准备、解析、初始化,其中验证、准备、解析可以归纳为 “连接” 阶段。

2023-03-15 18:00:28 1207 2

原创 【JVM】字节码指令

一些比较小的数字,比如10这样的数字,并不存储在运行时常量池的,它是跟着方法的字节码指令存储在一起的。,这个指令的意思是将一个byte压进操作数栈(其长度会补齐4字节),类似的指令还有。首先,会由JVM的类加载器把main方法所在的这个类进行一个类加载的操作。最后return,完成main方法的调用,弹出main栈帧,程序结束。接着将操作数栈中的变量弹出,放置在3号位置中,也就是赋值给c。,接着将操作数栈中的32768放置在局部变量表的2号槽位。方法,生成新的栈帧,传递参数并执行新栈帧的字节码。

2023-03-10 06:00:00 746

原创 【操作系统】进程和线程的区别

进程和线程这两个名词天天听,但是对于它们的含义和关系其实还有点懵的,其实除了进程和线程,还存在一个协程,它们的关系如下:首先,我们需要明白一个笼统的定义(并不严谨):进程 > 线程 > 协程。进程: 是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。线程: 是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。协程: 是一种比线程更加轻量级的存在。一个线程也可以拥有多个协程。

2023-03-06 17:47:39 599

原创 【JVM】7种经典的垃圾收集器

图中所示七种垃圾收集器虽然算不上先进技术,但是它们在实践中足够成熟,基本上可以认为是现在未来两、三年内,能够在生产环境上放心使用的所有垃圾收集器了。这七种垃圾收集器是作用于不同分代的,两个收集器之间若有连线,则说明它们可以搭配使用。垃圾收集器的位置则表示了属于新生代还是老年代收集器。串行吞吐量优先响应时间优先。

2023-02-12 16:29:25 1736 3

原创 【JavaSE】深入HashMap

HashMap是Java中最常用的集合框架。在JDK1.7的时候,HashMap的底层由数组和链表组成。数组是HashMap的主体,而链表是为了解决哈希冲突而存在的。在JDK1.8的时候,HashMap的底层由数组、链表和红黑树组成。红黑树的出现是为了解决因哈希冲突导致的链表长度过长影响HashMap性能的问题。红黑树搜索的空间复杂度为O(logn),而链表却是O(n)。也就是当链表的长度达到一定长度后,链表就会进行树化,当然这是一种笼统说法,具体细节待会深究。

2023-02-10 10:35:25 880 3

原创 【JavaSE】fail-fast与fail-safe源码分析

快速失败(fail-fast),快速失败是Java集合的一种错误检测机制。出现场景:线程A在使用迭代器遍历一个集合对象的时候,线程B对集合对象的内存进行了操作(增加、删除、修改),这时候会抛出原理:就拿ArrayList来说,ArrayList继承了一个抽象类,这个抽象了中有一个成员变量,这个变量是记录集合被修改的次数的。集合使用迭代器进行遍历的时候,每当迭代器使用之前,会先检测modCount变量是否为值,是的话就遍历;否则抛出异常。注意:这里抛出异常的判断条件为modCount变量是否为。

2023-02-07 06:00:00 430 2

原创 【JVM】垃圾回收算法与分代回收

根据判定对象消亡的角度来看,垃圾收集算法可分为引用计数式垃圾收集(直接垃圾收集)追踪式垃圾收集(间接垃圾收集)Java虚拟机中采用的是追踪式垃圾收集,追踪式垃圾收集有标记-清除算法标记-复制算法。

2023-02-04 06:00:00 1290 3

原创 【JavaSE】ArrayList的扩容机制源码分析

ArrayList是Java集合框架中比较常用的一个数据结构了,它底层是基于数组实现的。数组是固定大小的,但是ArrayList的扩容机制可以实现容量大小的动态变化。数组的容量是在定义的时候确定的,如果数组满了,再插入,就会数组溢出。所以在插入时候,会先检查是否需要扩容,如果当前容量+1超过数组长度,就会进行扩容。ArrayList的扩容是创建一个1.5倍的新数组,然后把原数组的值拷贝过去。ArrayList添加元素有下面两种方式下面进行源码分析ArrayList扩容通常为原数组大小的1.5倍,并且。

2023-02-01 17:22:24 489 1

原创 【JVM】垃圾回收之对象已死

总所周知,垃圾收集器的任务就是将“死去”的对象回收。那么,垃圾收集器在对堆进行回收前,第一件事,就是要确认这些对象是否还“存活”着。引用计数算法可达性分析算法。

2023-01-30 06:00:00 226

原创 【JVM】详解直接内存

下面是 《深入理解 Java 虚拟机 第三版》2.2.7 小节 关于 Java 直接内存的描述。直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致异常出现,所以我们放到这里一起讲解。在 JDK 1.4 中新加入了类,引入了一种基于通道(Channel)与缓冲区(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里面的。

2023-01-27 14:47:12 2352

原创 【MySQL】MySQL索引夺命连环问「持续更新中」

覆盖索引在某个查询里面,索引 k 已经“覆盖了”我们的查询需求,称为覆盖索引。覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。之所以能减少树的搜索次数,比如说查询key1,使用了key1的索引,这个B+树的数据就包含了主键值+key1,因此不需要回表操作,减少了树的搜索次数。索引下推MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断。

2023-01-25 23:08:36 1039

原创 【JavaSE】浅析String与StringTable

String类是开发中经常使用的一个类。对String稍加理解的话,都会听到这样的一个词——字符串常量池(也叫StringTable)是用来存放字符串常量的,当我们使用相同字符串对象的时候,就不需要重新创建字符串对象,而是直接在常量池中获取,这一点和Integer的缓存有点类似。

2023-01-22 13:28:56 938

原创 【MySQL】深入学习B+索引的使用

学习数据库的同学应该都知道,索引是可以提高MySQL的查询效率的,但是吧,这个索引可不能乱加,如果加了一些没用的索引,不仅会浪费了空间并且还会浪费了时间。因为索引本身就是一个B+树,MySQL在进行增删改查的时候,都需要维护所有的B+索引树,因此可能会带有空间和时间上的损耗。

2023-01-16 19:07:47 857

原创 【Spring Cloud GateWay】ServerHttpResponseDecorator不生效

在Spring Cloud Gateway使用编码的方式实现一个全局拦截器,在全局拦截器中想要打印响应日志。,否则标准 NettyWriteResponseFilter 将在过滤器有机会被调用之前发送响应。在SpringCloudGateway中,有很多默认的全局过滤器。,所以它的order就是它自己设定的值。方法在服务返回响应的时候就能被调用了。于是自己装饰了一个具有打印日志功能的。,但是在转发后的服务返回响应的时候,它们对应的order值如下图所示。否则,它就没有order。查看了大量信息,最后得知,

2023-01-09 22:31:28 3371 6

原创 【JavaSE】深入理解Integer缓存原理

Integer类在对象中包装了一个基本类型int的值。Integer类对象包含一个int类型的字段。此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。首先,不仅仅是Integer类型有缓存常量池这个说法。Byte,Short,Integer,Long,Character都有缓存常量池。Byte,Short,Integer,Long为 缓存范围 -128 到 127Character缓存范围为 0 到 127。

2023-01-07 14:05:25 1216

原创 【MySQL】深入理解B+树索引

索引,是MySQL快速查询的秘籍。如果没有索引,是怎么查询记录的呢?首先,假如表中记录比较少,所有记录都可以存放在一个页中。以主键为搜索条件,这种就可以通过页目录使用二分法快速定位到相应的槽,接着遍历槽中的记录,就可以快速找到指定记录了。以其他列作为搜索条件,因为页中没有为非主键建立所谓的页目录,所以无法通过二分法定位槽的方式查找。只能从Infimum记录开始依次遍历单项链表的每条记录,然后对比是否符合搜索条件。(效率最低)如果表中记录很多,就需要用比较多的页存储这些记录定位记录所在页。

2023-01-03 22:11:48 1356 8

空空如也

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

TA关注的人

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