深入理解索引(二)
1.引言
在数据库和数据结构中,索引(Index)是一种用于提高数据检索速度的重要机制。本文将详细深入介绍索引。
2. 为什么要使用索引
大家在使用索引之前一定要搞清楚使用索引的目的,因为索引的不当使用可能不但起不到正向作用,反而会带来灾难性后果。一般来说使用索引的目的有以下几种:
- 加速数据检索
索引可以显著减少查询所需的时间,尤其是在处理大量数据时。例如,在关系数据库中,索引可以加快 SELECT 查询的执行速度。 - 提高查询效率
对于复杂的查询(如包含 JOIN、WHERE、ORDER BY、GROUP BY 等子句的查询),索引可以极大地提高查询效率。 - 唯一性约束
某些类型的索引(如主键索引和唯一索引)可以确保数据的唯一性,防止重复数据的插入。 - 强制数据完整性
通过索引,数据库可以更容易地实施数据完整性约束(如外键约束),确保数据之间的关联关系正确无误。 - 加快排序操作
如果索引包含排序信息(如 B-树索引),那么 ORDER BY 查询可以更快地执行,因为数据已经按索引顺序排列。 - 支持快速查找特定值
索引允许数据库系统快速定位特定值,而不需要扫描整个数据集。 - 优化连接操作
在关系数据库中,索引可以优化表之间的连接操作(如 JOIN),尤其是当连接条件被索引覆盖时。 - 提高数据更新性能(在某些情况下)
虽然索引会增加插入、更新和删除操作的开销,但在某些情况下(如批量更新),索引可以加快这些操作的速度,因为数据库系统可以利用索引来快速定位需要更新的记录。
3. 选择适合的索引类型
3.1 考虑查询类型
3.1.1 等值查询
- B - 树索引:如果经常进行等值查询(如查询工资等于某一具体数值的员工记录),B - 树索引是一个很好的选择。它可以通过从根节点到叶子节点的快速定位来找到对应的记录。例如,在一个员工信息表中,经常根据员工编号查找员工详细信息,对员工编号列建立 B - 树索引能高效地满足查询需求。
- 哈希索引:对于等值查询,哈希索引的性能也非常出色。在内存数据库或者对查询速度要求极高的场景下,如果主要是精确匹配查询,哈希索引可以在近乎常数时间内返回结果。比如,在一个高速缓存系统中,通过缓存键的精确匹配查询来获取缓存值,哈希索引能提供快速的查找。
3.1.2 范围查询
- B - 树索引:B - 树索引非常适合范围查询(如查询年龄在某个区间内的用户)。由于其索引键值是有序排列的,数据库可以沿着索引叶子节点顺序读取数据,减少磁盘 I/O 的随机访问。例如,在销售数据表中,查询销售额在一定区间内的订单记录,对销售额列建立 B - 树索引能有效提高查询效率。
- 位图索引(在一定条件下):对于低基数(不同取值较少)列的范围查询,位图索引可以通过位运算来合并查询条件,也能有较好的表现。例如,在一个用户状态(活跃 / 不活跃)列上的范围查询,利用位图索引可以快速定位符合条件的用户记录。
3.1.3 全文查询
- 全文索引:当需要对文本内容进行查询,如查找包含特定关键词的文档或者模糊查询时,全文索引是必不可少的。它可以对文本中的词汇单元进行分析和索引,支持多种文本搜索方式。例如,在一个内容管理系统中,用户搜索文章内容中的特定词汇,全文索引能够提供高效的搜索功能。
3.2 考虑数据列的特点
3.2.1 低基数列
- 位图索引:如果列的取值范围较小且重复值较多(如性别、状态等列),位图索引是一个不错的选择。它通过位图表示数据分布,在查询这类列时可以快速定位记录。例如,在一个电商用户表中,对于用户会员等级(只有普通、银卡、金卡等几种级别)列,位图索引能够高效地查询不同等级的用户。
- 不建议 B - 树索引(特殊情况除外):对于低基数列,B - 树索引可能不是最优的,因为索引的维护成本相对较高,且在查询时可能不会带来显著的性能提升,除非该列经常用于范围查询且与其他条件组合查询。
3.2.2 高基数列
- B - 树索引:当列的取值非常多(如身份证号码、产品序列号等),B - 树索引通常更合适。例如,在一个产品库存表中,产品序列号是唯一标识产品的高基数列,对该列建立 B - 树索引可以方便地通过产品序列号查询产品的库存信息。
- 哈希索引(有条件使用):在等值查询为主且对范围查询没有要求的情况下,对于高基数列也可以考虑哈希索引。但要注意哈希冲突问题以及哈希索引不支持范围查询等限制。
3.2.3 包含函数操作的列
- 函数索引:如果查询经常涉及对列的函数操作(如对日期列查询某一年的记录,需要提取年份函数),则应该建立函数索引。这样在查询时可以直接利用索引,而不需要每次都对列进行函数计算。例如,在一个财务报表表中,对日期列建立提取季度的函数索引,方便查询每个季度的财务数据。
3.3 考虑数据更新频率
3.3.1 更新频繁的数据列
- 谨慎使用索引:对于数据更新频繁的列,要谨慎使用索引。因为每次数据更新都可能导致索引的更新,增加系统的负担。例如,在一个实时交易记录表中,交易金额列可能频繁更新,如果对该列建立过多索引,会导致插入、更新和删除操作的性能下降。
- 哈希索引(特殊情况):哈希索引在更新操作方面有一定的特殊性。虽然它在等值查询上高效,但在数据更新时也需要重新计算哈希值并调整哈希桶。如果更新操作涉及哈希冲突的调整,可能会比较复杂,不过在某些场景下(如内存数据库的快速更新和查找平衡),仍然可以考虑使用。
3.3.2 相对稳定的数据列
- 可以积极使用索引:对于相对稳定的数据列,如系统配置参数表、数据字典表等,应该积极考虑使用索引来提高查询性能。例如,在一个软件系统的配置参数表中,参数名称列建立 B - 树索引后,在系统读取配置参数时可以快速定位,而不用担心频繁更新导致的索引维护问题。
3.4 考虑数据库的存储和性能要求
3.4.1 存储资源有限的情况
- 位图索引优势:如果存储资源有限,对于低基数列,位图索引可以在节省存储空间的同时提供较好的查询性能。因为它不需要像 B - 树索引那样存储每个索引键值和对应的行标识符,而是通过位图来表示数据分布。
3.4.2 性能要求极高的情况
- 哈希索引或 B - 树索引(根据查询类型):在对性能要求极高的场景下,如高并发的实时查询系统,需要根据主要的查询类型来选择。如果是等值查询为主,哈希索引可能更合适;如果涉及范围查询等多种查询类型,B - 树索引可能是更好的选择。同时,要考虑数据库的缓存机制和硬件性能(如内存大小、磁盘 I/O 速度等)对索引性能的影响。
4. 选择索引类型时,如何权衡空间和时间的开销
4.1 B - 树索引
4.1.1 时间开销
- 查询性能优势:B - 树索引在范围查询和等值查询方面都有较好的时间性能。对于范围查询,由于其键值是有序存储的,在查询一个区间内的值时,数据库可以沿着索引的叶子节点顺序读取数据,减少磁盘 I/O 的随机访问次数,从而提高查询效率。例如,在一个销售记录表中查询销售额在一定区间内的订单,B - 树索引能够快速定位到起始位置,然后顺序读取符合条件的记录。在等值查询时,也能通过从根节点到叶子节点的快速路径定位到目标记录。
- 更新性能影响:但 B - 树索引在数据更新操作(插入、删除和更新索引列)时,会产生一定的时间开销。当插入新数据时,可能会导致索引节点的分裂或合并操作,以保持树的平衡性。删除数据时也可能引起节点的调整。这些操作需要额外的时间来重新组织索引结构。例如,在一个高并发的在线交易系统中,如果频繁插入新订单记录,B - 树索引的维护可能会导致一定的性能延迟。
4.1.2 空间开销
B - 树索引需要存储索引键值、对应的行标识符(ROWID)以及用于维护树结构的节点信息。随着表中数据量的增加和索引列的增多,索引的大小会逐渐增大。例如,对于一个包含大量列的员工信息表,对多个列建立 B - 树索引,可能会占用相当可观的磁盘空间。
4.2 位图索引
4.2.1 时间开销
- 查询性能优势(低基数列):对于低基数(不同取值较少)列的查询,位图索引在时间性能上表现出色。通过位运算可以快速合并查询条件,定位到符合条件的记录。例如,在一个用户状态(活跃 / 不活跃)列上进行查询,位图索引可以快速扫描位图来确定状态为活跃的用户记录。然而,在高并发的更新环境下,位图索引的更新操作会比较复杂,因为插入或删除数据可能需要更新多个位图,这可能会导致锁竞争等问题,增加时间开销。
4.2.2 空间开销
位图索引对于低基数列可以节省空间。它不需要像 B - 树索引那样为每个键值存储 ROWID 等信息,而是通过位图来表示数据分布。但如果列的基数较高,位图索引的空间开销可能会急剧增加,因为每个不同的取值都需要一个单独的位图来表示。例如,对于一个取值范围很广的产品序列号列,使用位图索引可能会占用大量的空间。
4.3 哈希索引
4.3.1 时间开销
- 查询性能优势(等值查询):哈希索引在等值查询时时间性能极佳,几乎可以在常数时间内返回结果。例如,在一个内存数据库的键 - 值存储系统中,通过键的精确匹配查询,哈希索引可以快速定位到对应的存储位置。但哈希索引不支持范围查询,在这种情况下,可能需要进行全表扫描,这会带来巨大的时间开销。另外,哈希索引在处理哈希冲突时也会产生时间开销,尤其是当冲突严重时,在哈希桶内的查找时间会增加。
4.3.2 空间开销
哈希索引的空间开销主要取决于哈希桶的大小和数据量。为了减少哈希冲突,可能需要较大的哈希桶,但这会增加空间占用。同时,哈希索引也需要存储键 - 行映射关系,随着数据量的增加,空间开销也会相应增加。
4.4 函数索引
4.4.1 时间开销
- 查询性能优势(函数操作相关查询):函数索引在查询经常涉及对列的函数操作时,可以显著提高时间性能。例如,在一个日期列上建立提取月份的函数索引,查询某个月份的记录时,无需每次对日期列进行函数计算,直接利用索引即可快速定位。但在更新索引列时,由于需要重新计算函数值来更新索引,会增加时间开销。如果函数计算比较复杂,这种时间开销会更加明显。
4.4.2 空间开销
函数索引的空间开销类似于 B - 树索引,需要存储函数计算后的结果、对应的 ROWID 以及索引结构信息。其空间大小会随着数据量和函数的复杂程度而变化。
4.5 权衡策略
4.5.1 以时间性能为主的场景
如果应用场景对查询响应时间要求极高,且主要是等值查询,在空间允许的情况下,可以优先考虑哈希索引。如果涉及范围查询,B - 树索引可能是更好的选择。对于文本搜索,全文索引能够提供较好的时间性能,但要注意其更新成本。在数据更新操作相对较少的情况下,为了优化查询时间,可以积极建立合适的索引。
4.5.2 以空间性能为主的场景
当存储资源有限时,对于低基数列,位图索引是一个较好的空间 - 时间权衡选择。如果对空间占用要求非常严格,且查询性能可以适当牺牲,可以减少不必要的索引创建。例如,在一个嵌入式数据库系统中,由于存储设备容量有限,可能会谨慎使用索引,仅对最关键的查询列建立索引。
4.5.3 综合权衡场景
在大多数实际应用中,需要综合考虑时间和空间开销。可以通过性能测试和监控来确定最优的索引策略。例如,在一个企业级数据库应用中,先对主要的查询操作进行分析,根据数据列的特点和更新频率,初步选择可能合适的索引类型。然后,通过模拟实际负载进行性能测试,观察时间和空间的占用情况,对索引类型和数量进行调整,以达到最佳的平衡。
5. 索引的优化
5.1 定期评估索引的使用情况
5.1.1 查询索引使用统计信息:
在 Oracle 中,可以使用数据字典视图来查看索引的使用情况。例如,V$OBJECT_USAGE视图提供了有关索引是否被使用的信息。通过查询这个视图,可以了解哪些索引在实际的查询操作中被使用,哪些没有被使用。
示例查询语句如下:
SELECT * FROM V$OBJECT_USAGE WHERE INDEX_NAME = 'your_index_name';
5.1.2 识别未使用的索引:
如果发现某些索引长时间未被使用,那么这些索引可能是优化的对象。未使用的索引会占用磁盘空间,并且在数据更新时还会增加不必要的维护开销。
不过,需要注意的是,仅仅因为某个索引在一段时间内未被查询统计信息记录为使用,并不一定意味着它完全没有价值。可能是因为应用程序的查询模式尚未触发对该索引的使用,或者是查询优化器在某些情况下选择不使用该索引。
5.2 优化索引列的选择
5.2.1 选择高选择性列:
高选择性列是指那些在表中不同值的数量与总行数的比例较高的列。例如,在一个包含员工信息的表中,员工编号(假设是唯一的)列就是高选择性列。
对于高选择性列建立索引,在进行等值查询(如查询特定员工编号的员工信息)时,能够更精准地定位到目标数据行,减少查询时需要扫描的数据量,从而提高查询效率。
5.2.2 避免对低选择性列过度索引:
低选择性列是指那些取值重复率高的列,如性别列(只有男和女两种取值)。对于这样的列,除非有特殊的查询需求(如频繁查询某一性别的所有记录,且数据量巨大),否则过度建立索引可能不会带来显著的查询性能提升,反而会增加数据更新时的索引维护成本。
5.2.3 考虑组合索引的列顺序:
当创建组合索引时,列的顺序至关重要。应该将最常用于过滤数据的列放在组合索引的最前面。
例如,在一个订单表中,有客户编号(customer_id)和订单日期(order_date)两个列。如果大多数查询首先是根据客户编号进行筛选,然后才考虑订单日期,那么组合索引应该按照(customer_id, order_date)的顺序创建。这样,在查询时可以更有效地利用索引,先通过客户编号快速定位到一部分数据,再在这部分数据中根据订单日期进一步筛选。
5.3 处理索引碎片
5.3.1 识别索引碎片程度:
可以使用 Oracle 提供的工具或查询来评估索引的碎片程度。例如,通过查询数据字典视图或者使用 Oracle 的分析工具(如 DBMS_STATS)来获取索引的物理存储信息,包括索引块的使用情况、叶子节点的填充程度等。
如果发现索引块的空闲空间过多,或者叶子节点的数据分布不均匀,就可能存在索引碎片问题。
5.3.2 重建或重组索引:
当索引碎片严重影响性能时,可以采取重建或重组索引的措施。
重建索引(ALTER INDEX index_name REBUILD;)会重新创建索引结构,将数据重新组织,消除碎片。重组索引(如使用ALTER INDEX index_name COALESCE;对于 B - 树索引)是一种相对温和的方式,它主要是将索引的相邻空闲空间合并,在一定程度上减少碎片,同时对系统的影响相对较小。不过,重组索引可能无法完全消除碎片,对于严重碎片化的索引,重建可能是更有效的方法。
5.4 优化索引参数设置(针对 B - 树索引)
5.4.1 调整索引块大小(PCTFREE 和 PCTUSED):
PCTFREE 参数用于指定在索引块中为将来的更新操作(如插入新的索引键值)预留的空闲空间百分比。较高的 PCTFREE 值可以减少更新索引时的块分裂操作,但会增加索引的存储空间占用。
PCTUSED 参数用于确定当索引块的使用空间低于多少百分比时,可以重新插入数据。合理设置这两个参数可以优化索引块的空间利用效率,减少索引结构的频繁调整。
5.4.2 考虑索引的存储参数(如 TABLESPACE):
根据数据的访问频率和重要性,将索引存储在合适的表空间(TABLESPACE)中。例如,对于频繁访问的索引,可以将其存储在性能较好的表空间(如存储在高速磁盘设备上的表空间),以提高查询响应速度。
码字不易,宝贵经验分享不易,请各位支持原创,转载注明出处,多多关注作者,后续不定期分享DB基本知识和排障案例及经验、性能调优等。
相关文章:
深入理解索引(二)
1.引言 在数据库和数据结构中,索引(Index)是一种用于提高数据检索速度的重要机制。本文将详细深入介绍索引。 2. 为什么要使用索引 大家在使用索引之前一定要搞清楚使用索引的目的,因为索引的不当使用可能不但起不到正向作用&a…...
Python 开发工具 -- PyCharm 简介
一、PyCharm 简介 PyCharm 是由 JetBrains 打造的一款 Python IDE。 PyCharm 具备一般 Python IDE 的功能,比如:调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。 另外,PyCharm 还提供了一些很好的功能用…...
C# 属性 学习理解记录
字段和属性 左边字段,右边属性 拓展,属性安全: 1、设置public private 和protected 等,只读,只写, 2、在get set 方法时,验证,异常时抛出错误...
使用chrome 访问虚拟机Apache2 的默认页面,出现了ERR_ADDRESS_UNREACHABLE这个鸟问题
本地环境 主机MacOs Sequoia 15.1虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 服务器版本 最小安装 开发环境 编辑器编译器调试工具数据库http服务web开发防火墙Vim9Gcc13Gdb14Mysql8Apache2Php8.3Iptables 第一坑 数…...
【大数据学习 | Spark-Core】Spark的分区器(HashPartitioner和RangePartitioner)
之前学过的kv类型上面的算子 groupby groupByKey reduceBykey sortBy sortByKey join[cogroup left inner right] shuffle的 mapValues keys values flatMapValues 普通算子,管道形式的算子 shuffle的过程是因为数据产生了打乱重分,分组、排序、join等…...
第六届国际科技创新学术交流大会(IAECST 2024)暨第四届物流系统与交通运输国际学术会议(LSTT 2024)
重要信息 会议官网:www.lstt.org 大会时间:2024年12月6-8日 大会地点:中国-广州 大会简介 第六届国际科技创新学术交流大会暨第四届物流系统与交通运输国际学术会议(LSTT 2024)将于2024年12月6-8日在广州举办&…...
看Threejs好玩示例,学习创新与技术(ogl)
本文标题可能看的你莫名奇妙,什么是ogl?ogl是一个新的三维引擎库,可以简单任务是非常简化的ThreeJS。下面图是它的一个示例,可见虽然它是一个麻雀,但五脏还是比较全的。 1、先说OGL OGL的代码非常简单,主要…...
读书笔记_《创华为.任正非传》_精华书摘
人生经历 43岁,开始创建华为 爷爷:金华火腿乡间厨师 父亲: 1910年生,北平民大经济系读书->职业学校任教->国民党兵工厂会计,组织读书会(读书会后来有很多人在新中国成立后成为高级干部。) 母亲: 高中毕业,乡村教师…...
4.4 MySQL 触发器(Trigger)
触发器是一种特殊的数据库对象,在特定事件(如INSERT、UPDATE或DELETE)触发时自动执行定义好的操作。它可以帮助我们实现更高效的数据管理和业务规则的约束。 1. 简介 1.1 什么是触发器 触发器(Trigger)是由用户定义的…...
遗传算法(Genetic Algorithm, GA)
简介 遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传机制的优化算法,由 John Holland 于20世纪70年代提出。它是一种模拟生物进化过程的启发式搜索算法,被广泛应用于函数优化、机器学习、调度问题等领域。 代码说明 …...
CentOS8.5.2111(7)完整的Apache综合实验
一、实验目标 1.掌握Linux系统中Apache服务器的安装与配置; 2.掌握个人主页、虚拟目录、基于用户和主机的访问控制及虚拟主机的实现方法。 二、实验要求 练习使用linux系统下WEB服务器的配置方法。 三、实验背景 重庆工程学院为筹备“重庆工程大学”特申请了c…...
flink学习(3)——方法的使用—对流的处理(map,flatMap,filter)
map 数据 86.149.9.216 10001 17/05/2015:10:05:30 GET /presentations/logstash-monitorama-2013/images/github-contributions.png 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 83.149.9.216 10002 17/05/20…...
Feed流系统重构:架构篇
重构对我而言,最大的乐趣在于解决问题。我曾参与一个C#彩票算奖系统的重构,那时系统常因超时引发用户投诉。接手任务时,我既激动又紧张,连续两天几乎废寝忘食地编码。结果令人振奋,算奖时间从一小时大幅缩短至十分钟。…...
YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路
YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions》 一、 模块介绍 论文链接:https://arxiv.org…...
java: itext 5.5 create pdf
/*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看: https://github.com/itext/itext-publications-examples-java/blob/develop/src/main/java/com/itextpdf/samples/sandbox/fonts/FreeSansBold.java* 描述:https://mvnreposit…...
EF Core学习笔记二
一、新建.net core的控制台项目 二、安装Entity Framework Core 我们使用的数据库是Sqlite,所以我们需要的程序包是Microsoft.EntityFrameworkCore.Sqlite。 如果想了解更多EF Core NuGet包,请参考:EF Core NuGet 包 | Microsoft Learn Install-Package Microsoft.Entit…...
快速排序【hoare版】
目录 介绍 算法思路 函数实现 函数声明 确定基准值 创建新函数 创建循环找数据(right,left) 交换左右数据 交换条件设置 外部循坏条件设置 初步总结代码 循环条件完善 内层循环的完善 外层循环的完善 相遇值大于keyi 相遇值等于k…...
day03(单片机高级)RTOS
目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台(中断方式) 改进(前后台(中断))定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…...
vue中v-if和v-show的区别
文章为本菜鸡学习过程中遇到的问题记录,不是专业的,如有问题和不足还请大佬指正 >参考文章 文章目录 前言1、v-if2、v-show3、v-if和v-show的区别 前言 问题描述: 在完成表单验证任务的学习过程中,发现在使用v-show隐藏元素后…...
MacOS通过VMware Fusion安装windows 11问题汇总
环境 虚拟机,VMware Fusion 13.6.1本地机器,ARM芯片的Mac,系统版本14.5Windows系统镜像,Window11 ARM 64 bit 安装卡在WiFi连接界面 适合我本地环境的解决步骤为: 1、系统设置网络共享 我开启的是en5,这…...
Stable Diffusion的解读(二)
Stable Diffusion的解读(二) 文章目录 Stable Diffusion的解读(二)摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...
十五届蓝桥杯赛题-c/c++ 大学b组
握手问题 很简单,相互牵手即可,但是要注意,第一个人只能与其他49个人牵手,所以开头是加上49 #include <iostream> using namespace std; int main() {int cnt0;for(int i49;i>7;i--){cnti;//cout<<i<<&quo…...
NFS搭建
NFS搭建 单节点安装配置服务器安装配置启动并使NFS服务开机自启客户端挂载查看是否能发现服务器的共享文件夹创建挂载目录临时挂载自动挂载 双节点安装配置服务器安装配置服务端配置NFS服务端配置Keepalived编辑nfs_check.sh监控脚本安装部署RsyncInofity 客户端 单节点安装配置…...
【贪心算法第二弹——2208.将数组和减半的最小操作数】
1.题目解析 题目来源 2208.将数组和减半的最小操作数——力扣 测试用例 2.算法原理(贪心策略) 3.实战代码 class Solution { public:int halveArray(vector<int>& nums) {priority_queue<double> hash;double sum 0.0;for(auto e : nums){hash.push(e);sum …...
ByteBuffer 与 ByteBuf 的对比与优缺点分析
在 Java 网络编程和高性能 I/O 场景中,ByteBuffer 和 ByteBuf 是两种重要的缓冲区处理工具。ByteBuffer 是 Java NIO 标准库的一部分,而 ByteBuf 是由 Netty 框架提供的增强缓冲区工具。在实际开发中,选择哪一种取决于场景需求和性能目标。 …...
SpringBoot 集成 html2Pdf
一、概述: 1. springboot如何生成pdf,接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节:页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…...
【IDEA】插件篇
环境:Mac M ,IDEA 2024.2.4 一、汉化 & 汉化后转回英文 1、汉化 IntelliJ IDEA -> Preferences -> Plugins -> MarketPlace,输入 chinese,点击 安装,安装完成后 重启IDE 2、汉化后转回英文 IntelliJ …...
librdns一个开源DNS解析库
原文地址:librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器,用于DNS解析。 源代码地址:GitHub - vstakhov/librdns: Asynchrono…...
数据结构 【带环单链表】
在单链表中可能会存在一种情况,某一结点在经过几次转移之后回到了自己本身,这种情况就称之为带环链表。对于带环链表,我们不能轻易对其进行遍历,遍历可能会导致产生死循环。 带环链表的逻辑图如下所示:(这…...
CodiMD导出pdf失败或无中文
CodiMD导出pdf失败,弹出文件保存窗口,有个pdf文件能下载,但是保存的时候提示“网站出问题了”,实际到服务器上看会发现docker崩溃了。 解决办法: 使用最新的CodiMD镜像,如nabo.codimd.dev/hackmdio/hackmd:…...
基于Java Springboot高校教务管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
大数据调度组件之Apache DolphinScheduler
Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 主要特性 易于部署,提供四种部署方式,包括Standalone、Cluster、Docker和…...
Python 快速入门(上篇)❖ Python基础知识
Python 基础知识 Python安装**运行第一个程序:基本数据类型算术运算符变量赋值操作符转义符获取用户输入综合案例:简单计算器实现Python安装** Linux安装: yum install python36 -y或者编译安装指定版本:https://www.python.org/downloads/source/ wget https://www.pyt…...
JAVA实现将PDF转换成word文档
POM.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...
Python学习29天
二分查找 # 定义函数冒泡排序法从大到小排列 def bbble_sort(list):# i控制排序次数for i in range(len(list) - 1):# j控制每次排序比较次数for j in range(len(list) - 1 - i):if list[j] < list[j 1]:list[j], list[j 1] list[j 1], list[j] # 定义二分查找函数 def…...
FreeSWITCH 简单图形化界面35 - 使用python脚本
FreeSWITCH 简单图形化界面35 - 使用python脚本 测试环境1、mod_python编译2、Python编写拨号规则(dialplan)测试一下不带参数带参数 3、使用Python执行freeSWITCH的API测试一下 4、Python执行session API测试一下 5、Python编写聊天规则(chatplan)测试一下 6、Python执行messa…...
基于AIRTEST和Jmeter、Postman的自动化测试框架
基于目前项目和团队技术升级,采用了UI自动化和接口自动化联动数据,进行相关测试活动,获得更好的测试质量和测试结果。...
web-03
CSS回顾 选择器 标签选择器 标签{}ID选择器 标签中定义ID属性。 #ID值{}类选择器 标签中使用class属性 .类名{}关于DIV/span div任意的大小的长方形,大小css: width, height控制。—换行 span-- 一行内 CSS常用属性 width/height 宽度/高度 定义&…...
MySQL 死锁
一、引言 在 MySQL 数据库的使用过程中,死锁问题就像一颗隐藏在暗处的 “定时炸弹”,平时可能感觉不到它的存在,但一旦触发,就可能导致数据库事务无法正常推进,严重影响系统的性能和可用性。对于开发人员和数据库管理员…...
M|大脑越狱
rating: 7.0 豆瓣: 7.6 上映时间: “2015” 类型: M悬疑 导演: 约瑟夫怀特 Joseph White 主演: 亚历山大欧文 Alexander Owen爱德华富兰克林 Edward Franklin 国家/地区: 英国 片长/分钟: 20分钟 M|大脑越狱 想法不错,但是逻辑比较一般。属于…...
CSS3_媒体查询(十一)
CSS3_响应式布局 1、媒体样式 在不同媒体上显示不同的样式。 常用阈值: 小于768px:小屏幕;768px-992px:中等屏幕;992px-1200px:大屏幕;大于1200px:超大屏幕。 <!DOCTYPE html>…...
Spring |(四)IoC/DI配置管理第三方bean
文章目录 📚数据源对象管理🐇环境准备🐇实现Druid管理🐇实现C3P0管理 📚加载properties文件🐇第三方bean属性优化🐇读取单个属性 学习来源:黑马程序员SSM框架教程_SpringSpringMVCMa…...
Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)
目录 1.1鼠标进入和离开enterEvent\leaveEvent 1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent 1.3定时器事件timerEvent 1.4定时器类QTimer 1.5事件分发器event 1.6事件过滤器eventFilter 1.1鼠标进入和离开enterEvent\leaveEvent 事件&#x…...
MySQL-存储过程
目录 一、存储过程定义 二、存储过程创建 1、变量的定义 2、存储过程的分支语句 2.1 双分支IF语句 2.2 多分支IF语句 3、存储过程的循环语句 三、存储过程调用 四、存储过程显示和删除 一、存储过程定义 存储过程(Stored Procedure)是一种在数…...
数据指标与标签在数据分析中的关系与应用
导读:分享数据指标体系的文章很多,但讲数据标签的文章很少。实际上,标签和指标一样,是数据分析的左膀右臂,两者同样重要。实际上,很多人分析不深入,就是因为缺少对标签的应用。今天系统的讲解下…...
LWE详细介绍
LWE问题,即学习误差问题(Learning With Errors problem),是密码学中一个重要的硬问题,尤其在后量子密码学中占有核心地位。LWE问题由Regev在2005年提出,其设计基于格理论,被认为是一个在平均情况…...
Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程
目录 ⛳️推荐 前言 1. 安装docker与docker-compose 2. 启动容器运行镜像 3. 本地访问测试 4.安装内网穿透 5. 创建公网地址 6. 创建固定公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...
【Spring MVC】初步了解Spring MVC的基本概念与如何与浏览器建立连接
前言 🌟🌟本期讲解关于SpringMVC的基础概念,以及如何实现与浏览器的连接,参数的传递~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 …...
游戏AI实现-决策树
代码实现: 定义一个决策树节点 class DecisionTreeNode{public DecisionTreeNode(){} } 定义一个行为类: class Action : DecisionTreeNode{ } 定义一个决策类: class Decision : DecisionTreeNode{ } 应用: 参考书…...
9个最佳WordPress PDF插件(查看器、嵌入和下载)
在过去的几年里,我们一直在使用不同的 PDF 插件在我们的网站上创建、编辑和嵌入文档。 然而,经过多次尝试和错误,我们意识到并不是每个插件都是相同的。事实上,为您的企业或电子商务网站选择合适的 PDF 插件可能是一项艰巨的任务…...