当前位置: 首页 > news >正文

PostgreSQL:索引与查询优化

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

PostgreSQL:索引与查询优化

引言

在当今数据驱动的商业环境中,一个典型的中型电商平台每秒可能处理超过5000次数据库操作。当我们在搜索框输入"男士运动鞋"时,后台的PostgreSQL数据库需要在0.2秒内从上亿条商品记录中筛选出符合条件的结果——这个看似简单的操作背后,是索引结构和查询优化器在精密配合。

索引就像数据库的"超能力药剂",但错误的使用方式可能导致性能雪崩:某知名社交平台曾因错误添加GIN索引导致写入延迟增加300%,直接造成用户发帖量下降15%。这警示我们,索引的威力与风险并存。

本文将带您深入PostgreSQL的索引迷宫,不仅解析各种索引的运行机制,更将揭示查询优化器的决策逻辑。通过20+个真实故障案例的逆向分析,带您了解:

  • 如何为JSONB数据设计复合GIN索引
  • B-Tree索引的隐藏排序特性如何影响分页查询
  • 并行查询执行计划的特征识别
  • 利用覆盖索引实现100倍性能提升的秘诀

1. 索引的微观世界:从磁盘结构到查询加速

1.1 存储引擎的底层革命(新增)

1.1.1 页结构与行指针

PostgreSQL的数据存储以**页(Page)**为基本单位(默认8KB)。每个页包含:

+-----------------------------+
| Page Header (24B)           |
|-----------------------------|
| Line Pointer Array          |
| (ItemIdData, 4B per item)   |
|-----------------------------|
| Free Space                  |
|-----------------------------|
| Heap Tuples (实际数据行)     |
|-----------------------------|
| Special Space               |
+-----------------------------+

**行指针(ItemIdData)**是理解索引的关键——每个指针包含:

  • 偏移量(15位)
  • 长度(15位)
  • 状态标记(2位)

当创建B-Tree索引时,实际存储的是**键值+行指针(CTID)**的组合。例如,对于ctid='(10,2)'的索引条目,表示该键值对应的数据行位于第10页的第2个行指针位置。

1.1.2 TOAST机制与索引限制

当数据行超过页大小的1/4(约2KB)时,会触发**TOAST(The Oversized-Attribute Storage Technique)**机制。这对索引的影响包括:

  1. 普通索引无法索引TOASTed字段
  2. 全文搜索需要结合tsvector的存储优化
  3. JSONB字段的索引需要考虑文档大小

解决方案示例:

-- 创建支持大文本的GIN索引
CREATE INDEX idx_gin_content ON articles 
USING GIN (to_tsvector('english', content));

1.2 B-Tree的进阶特性(深度扩展)

1.2.1 索引的物理排序

B-Tree索引在物理存储上保持键值的升序排列,这个特性可以优化范围查询:

-- 以下查询可以利用索引的物理顺序
SELECT * FROM orders 
WHERE order_date BETWEEN '2023-01-01' AND '2023-01-31'
ORDER BY order_date DESC
LIMIT 100;

执行计划显示:

Limit  (cost=0.42..12.67 rows=100 width=146)->  Index Scan Backward using idx_order_date on ordersIndex Cond: ((order_date >= '2023-01-01'::date) AND (order_date <= '2023-01-31'::date))

关键洞察Backward扫描方向表明优化器利用了索引的物理顺序,避免了显式排序。

1.2.2 索引的可见性映射(Visibility Map)

PostgreSQL通过**Visibility Map(VM)**跟踪哪些数据页包含所有可见事务的数据。这对索引扫描的影响:

  • 当VM显示某页全部可见时,可以跳过可见性检查
  • 频繁更新的表需要更频繁的vacuum维护VM
  • 通过pg_visibility扩展可查看VM状态

优化案例:

-- 查询活跃用户(假设大多数用户处于活跃状态)
CREATE INDEX idx_active_users ON users (status) 
WHERE status = 'active';-- 结合VM,该部分索引可加速查询
SELECT * FROM users 
WHERE status = 'active' 
ORDER BY last_login DESC 
LIMIT 100;

1.3 GIN索引的深度调优(新增章节)

1.3.1 fastupdate选项的权衡

GIN索引的fastupdate参数(默认开启)控制写入行为:

  • 开启:新条目先缓存在内存的待处理列表,批量写入
  • 关闭:立即写入索引,查询可见性更好

性能对比测试:

-- 测试表
CREATE TABLE documents (id serial PRIMARY KEY,content text
);-- 创建两种索引
CREATE INDEX idx_gin_fast ON documents USING GIN (to_tsvector('english', content))
WITH (fastupdate=on);CREATE INDEX idx_gin_no_fast ON documents USING GIN (to_tsvector('english', content))
WITH (fastupdate=off);

插入性能测试结果(100万条记录):

索引类型插入时间索引大小
idx_gin_fast78s1.2GB
idx_gin_no_fast215s1.1GB

生产建议:在高写入场景保持fastupdate=on,定期执行VACUUMgin_clean_pending_list

1.3.2 jsonb_path_ops的魔法

处理JSONB数据时,jsonb_path_ops运算符类可以显著减少索引大小:

-- 传统jsonb_ops索引
CREATE INDEX idx_gin_ops ON orders USING GIN (metadata);-- 优化后的path_ops索引
CREATE INDEX idx_gin_path_ops ON orders USING GIN (metadata jsonb_path_ops);

对比结果:

查询类型idx_gin_opsidx_gin_path_ops
metadata @> ‘{“price”:100}’12ms8ms
索引大小4.2GB1.8GB

原理:jsonb_path_ops只索引路径和值,忽略键顺序,更适合精确匹配查询。

2. 索引生命周期管理:从创建到消亡的全过程

2.1 并发创建索引的黑暗面(新增)

PostgreSQL支持CONCURRENTLY方式创建索引,避免锁表:

CREATE INDEX CONCURRENTLY idx_conc ON large_table (column);

但存在以下风险:

  1. 事务隔离问题:创建过程中其他事务的修改可能不会被索引捕获
  2. 死锁风险:需要处理多个事务的依赖关系
  3. 存储峰值:需要额外的临时存储空间

最佳实践:

# 在低峰期执行
SET statement_timeout = '30s';
BEGIN;
CREATE INDEX CONCURRENTLY idx_conc ON tbl (col);
COMMIT;# 检查状态
SELECT relname, relkind, relpersistence 
FROM pg_class 
WHERE relname = 'idx_conc';

2.2 索引的碎片化战争(新增)

长期运行的数据库会出现索引膨胀,通过pg_stat_all_indexes监控:

SELECT schemaname,relname,indexrelname,idx_scan,idx_tup_read,idx_tup_fetch,pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
FROM pg_stat_all_indexes
WHERE schemaname = 'public';

处理策略:

  1. REINDEX

    REINDEX INDEX CONCURRENTLY idx_name;
    
  2. pg_repack工具:

    pg_repack --no-order --table tbl_name db_name
    
  3. 增量维护:

    VACUUM (VERBOSE, ANALYZE) tbl_name;
    

3. EXPLAIN的暗黑解读手册

3.1 并行查询的蛛丝马迹(新增)

在PostgreSQL 16中,并行查询计划会显示Parallel节点:

Gather  (cost=1000.00..12554.32 rows=1000 width=40)Workers Planned: 4->  Parallel Seq Scan on orders Filter: (total_amount > 1000)

关键参数解析:

  • max_parallel_workers_per_gather:控制并行工作进程数
  • parallel_tuple_cost:优化器对并行传输的代价评估
  • min_parallel_table_scan_size:触发并行的表大小阈值

强制并行提示(谨慎使用):

SET max_parallel_workers_per_gather = 8;

3.2 物化节点的秘密(新增)

当查询包含子查询或CTE时,可能看到Materialize节点:

Hash Join  (cost=150.25..180.34 rows=1000 width=40)Hash Cond: (orders.customer_id = customers.id)->  Seq Scan on orders  (cost=0.00..150.00 rows=10000)->  Hash  (cost=130.20..130.20 rows=1000)->  Materialize  (cost=100.15..130.20 rows=1000)->  Index Scan using idx_cust_active on customersIndex Cond: (status = 'active')

优化策略:

-- 将子查询改为LATERAL JOIN
SELECT o.* 
FROM customers c
JOIN LATERAL (SELECT * FROM orders WHERE customer_id = c.idORDER BY order_date DESCLIMIT 5
) o ON true
WHERE c.status = 'active';

4. 高级优化兵法:超越基础技巧

4.1 时间序列的BRIN魔法(新增)

对于时间序列数据,**BRIN(Block Range INdex)**索引可大幅减少索引大小:

CREATE TABLE sensor_data (ts timestamp PRIMARY KEY,value double precision
) WITH (autovacuum_enabled=on);CREATE INDEX idx_brin_ts ON sensor_data 
USING BRIN (ts) WITH (pages_per_range=32);

性能对比(10亿条记录):

查询条件B-TreeBRIN
ts BETWEEN … (1小时)15ms8ms
索引大小28GB2MB

调整pages_per_range的黄金法则:

-- 计算最佳参数
SELECT relname,avg_range_size,pages_per_range
FROM brin_page_items(get_raw_page('idx_brin_ts', 0), 'idx_brin_ts');

4.2 表达式索引的陷阱与救赎(新增)

表达式索引虽然强大,但存在版本兼容问题:

-- 创建基于函数的索引
CREATE INDEX idx_lower_name ON users (lower(name));-- 查询必须完全匹配表达式
EXPLAIN ANALYZE
SELECT * FROM users WHERE lower(name) = 'alice'; -- 使用索引EXPLAIN ANALYZE 
SELECT * FROM users WHERE name ILIKE 'Alice%';   -- 不使用索引

解决方法:

-- 创建操作符类支持的模式索引
CREATE INDEX idx_trgm_name ON users 
USING GIN (name gin_trgm_ops);SET pg_trgm.similarity_threshold = 0.3;SELECT * FROM users 
WHERE name % 'Alic';

5. 实战演练:电商平台性能优化全记录

5.1 案例背景

某电商平台商品表:

CREATE TABLE products (id BIGSERIAL PRIMARY KEY,sku VARCHAR(32) UNIQUE,attributes JSONB,category_id INT,price NUMERIC(10,2),created_at TIMESTAMPTZ DEFAULT NOW()
);

查询瓶颈:

  • 商品搜索页面的分页性能差
  • 属性过滤响应时间超过2秒
  • 价格区间查询偶尔全表扫描

5.2 分页优化三部曲

原始查询

SELECT * FROM products
WHERE category_id = 123
ORDER BY created_at DESC
LIMIT 20 OFFSET 10000;

问题分析:OFFSET导致扫描前10000行

优化方案

-- 使用游标分页
CREATE INDEX idx_cat_created ON products (category_id, created_at DESC);SELECT * FROM products
WHERE category_id = 123 AND created_at < '2023-06-01'
ORDER BY created_at DESC
LIMIT 20;

效果对比

分页深度原查询时间优化后时间
第10页120ms15ms
第100页980ms18ms

参考资料

  1. PostgreSQL 16官方文档 - 索引篇
  2. 《PostgreSQL Query Optimization》by Hans-Jürgen Schönig
  3. 论文《The Bw-Tree: A B-tree for New Hardware Platforms》
  4. PGCon 2023主题演讲《Advanced Indexing Strategies》
  5. CitusData博客《BRIN Index Deep Dive》

相关文章:

PostgreSQL:索引与查询优化

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

Android Compose 框架的 ViewModel 委托深入剖析(二十)

Android Compose 框架的 ViewModel 委托深入剖析 一、引言 在 Android 开发中&#xff0c;数据的管理和状态的保存是至关重要的。ViewModel 作为 Android 架构组件的一部分&#xff0c;为我们提供了一种在配置更改&#xff08;如屏幕旋转&#xff09;时保存数据和管理 UI 状态…...

android|生成二维码qrcode(android)

1.build.gradle implementation com.google.zxing:core:3.4.1引入zxing库 只是生成的话引入core库就可以了 2.封装方法 import android.graphics.Bitmap; import android.graphics.Color;import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; imp…...

element-plus中el-empty空盒子组件和Collapse 折叠面板组件的使用

一.el-empty空盒子组件的使用 直接复制下面的代码&#xff1a; <el-empty description"description" /> 展示效果&#xff1a; 还可以自定义文字描述&#xff1a; <el-empty description"暂未选择患者"/> 二.Collapse 折叠面板组件的使用 复制…...

Windows 和 Linux 操作系统架构对比以及交叉编译

操作系统与架构兼容性详解 1. 可执行文件格式&#xff1a;PE vs ELF Windows: PE (Portable Executable) 格式 详细解释&#xff1a; PE 格式是 Windows 下的可执行文件标准 包含多个区段&#xff08;Sections&#xff09;&#xff0c;如代码段、数据段、资源段 文件头包含…...

【区块链安全 | 第一篇】密码学原理

文章目录 1.哈希函数1.1 哈希函数的性质1.2 常见哈希算法1.3 Merkle Tree&#xff08;默克尔树&#xff09;1.4 HMAC&#xff08;哈希消息认证码&#xff09; 2. 公钥密码学2.1 对称加密 vs 非对称加密2.2 RSA 算法2.3 ECC&#xff08;椭圆曲线密码学&#xff09;2.4 Diffie-He…...

3.23[A]linux

gedit 是 GNOME 桌面环境下的文本编辑器&#xff0c;类似于 Windows 中的记事本&#xff0c;但功能更强大&#xff0c;支持语法高亮、多文件编辑等特性。它是一个图形化界面的文本编辑器&#xff0c;适合在需要直观编辑文本文件的场景中使用。 gedit 通常用于编辑配置文件、源代…...

AI革命之下的前端将会如何发展?

一、AI 为前端开发带来的变革 &#xff08;一&#xff09;提升开发效率 传统的 Web 前端开发常常面临大量重复性工作&#xff0c;如编写简单表单、布局组件等&#xff0c;这些工作耗时费力且易出错&#xff0c;严重影响开发效率和项目进度。而 AI 的出现&#xff0c;通过自动…...

【2025】基于springboot+vue的农产品商城系统设计与实现(源码、万字文档、图文修改、调试答疑)

项目完整功能以演示视频为准 基于Spring Boot Vue的农产品商城系统设计与实现功能结构图如下&#xff1a; 课题背景 随着互联网的普及和电子商务的快速发展&#xff0c;农产品线上销售成为推动农业现代化和乡村振兴的重要力量。传统的农产品销售模式存在信息不对称、销售渠道单…...

沪深300股指期货的看涨看跌方式是怎样的?

沪深300指数代表了中国A股市场中300家大公司的整体表现。股指期货交易允许老板们预测指数未来的涨跌&#xff0c;并从中获利。 沪深300股指期货基础操作 首先&#xff0c;沪深300股指期货中的看涨操作&#xff1a;老板们可以通过买入沪深300股指期货合约&#xff0c;代码也就是…...

使用selenium来获取数据集

使用selenium来获取数据集 1、下载最新的chrome浏览器与chromedriver.exe 查看chrome的版本,打开谷歌浏览器,点击右上角的三个点,然后点击【帮助】, 点击【关于Google Chrome】 然后去下载同样为134版本号的chromedriver.exe, 网址:https://googlechromelabs.github.…...

MCP(大模型上下文协议)

以下是关于大模型MCP协议&#xff08;Model Context Protocol&#xff09;的详细介绍&#xff0c;综合其定义、技术架构、应用场景及行业影响&#xff1a; 一、定义与核心目标 **MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;**是由Anthropic…...

FPGA中串行执行方式之流水线(Pipeline)

FPGA中串行执行方式之流水线(Pipeline) 在FPGA设计中,​流水线(Pipeline)​ 是一种常见的优化技术,用于提高系统的吞吐量和性能。流水线通过将复杂的逻辑分解为多个阶段,每个阶段在一个时钟周期内完成一部分工作,并将中间结果传递到下一阶段。这种方式可以显著提高时钟…...

Python 3.8 Requests 爬虫教程(2025最新版)

遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私&#xff01; 一、环境配置与基础验证 # 验证 Python 版本&#xff08;需 ≥3.8&#xff09; import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库&#xff08;若未安装&#xff09; # 命令行执…...

【深度学习】GAN生成对抗网络:原理、应用与发展

GAN生成对抗网络&#xff1a;原理、应用与发展 文章目录 GAN生成对抗网络&#xff1a;原理、应用与发展1. 引言2. GAN的基本原理2.1 核心思想2.2 数学表达2.3 训练过程 3. GAN的主要变体3.1 DCGAN (Deep Convolutional GAN)3.2 CGAN (Conditional GAN)3.3 CycleGAN3.4 StyleGAN…...

LINUX基础 [三] - 进程创建

目录 前言 进程创建的初次了解&#xff08;创建进程的原理&#xff09; 什么是fork函数&#xff1f; 初识fork函数 写时拷贝 fork函数存在的意义 fork调用失败的原因 进程终止 运行完毕结果不正确 main函数返回 库函数函数exit 系统调用接口_exit 进程异常终止 进…...

AI比人脑更强,因为被植入思维模型【24】替身决策思维模型

定义 替身决策思维模型是一种在面对复杂问题或决策情境时&#xff0c;通过将自己代入到不同的角色&#xff08;即“替身”&#xff09;中&#xff0c;从这些角色的视角出发去思考、分析和做出决策的思维方式。这种思维模型要求决策者暂时摆脱自身固有的思维定式和立场&#xf…...

数据清洗:基于python抽取jsonl文件数据字段

基于python抽取目录下所有“jsonl”格式文件。遍历文件内某个字段进行抽取并合并。 import os import json import time from tqdm import tqdm # 需要先安装&#xff1a;pip install tqdmdef process_files():# 设置目录路径dir_path r"D:\daku\关键词识别\1623-00000…...

spring后端处理各种请求

在Spring MVC中处理JSON请求和返回JSON消息的步骤如下&#xff1a; 1. 添加依赖 确保项目中包含处理JSON的库&#xff0c;如Jackson。 Maven配置&#xff08;pom.xml&#xff09;&#xff1a; <dependency><groupId>com.fasterxml.jackson.core</groupId>…...

企业级部署zabbix分布式监控系统

目录 一、Zabbix分布式监控系统介绍 1.什么是“Zabbix” 2.Zabbix分布式监控系统的特点 3.Zabbix分布式监控系统的原理 4.Zabbix分布式监控系统的运用 5. Zabbix分布式监控系统的部署顺序 二、搭建 1.设备硬件配置参考 2.zabbix分布式监控系统各节点设备名称和IP规划 …...

OkHttp 的证书设置

在 Android 开发中&#xff0c;通过 OkHttp 自定义 SSLSocketFactory 和 X509TrustManager 可以有效增强 HTTPS 通信的安全性&#xff0c;防止中间人攻击&#xff08;如抓包工具 Charles/Fiddler 的拦截&#xff09;。以下是实现防抓包的关键技术方案&#xff1a; 一、Okhttp设…...

ETL:数据清洗、规范化和聚合的重要性

在当今这个数据呈爆炸式增长的时代&#xff0c;数据已成为企业最为宝贵的资产之一。然而&#xff0c;数据的海量增长也伴随着诸多问题&#xff0c;如数据来源多样、结构复杂以及质量问题等&#xff0c;这些问题严重阻碍了数据的有效处理与深度分析。在此背景下&#xff0c;ETL&…...

蓝桥杯备考:图的遍历

这道题乍一看好像没什么不对的&#xff0c;但是&#xff01;但是&#xff01;结点最大可以到10的5次方&#xff01;&#xff01;&#xff01;我们递归的时间复杂度是很高的&#xff0c;我们正常遍历是肯定通过不了的&#xff0c;不信的话我们试一下 #include <iostream>…...

【多媒体交互】Unity Kinect实现UI控件的点击

在Unity中&#xff0c;通过Kinect实现UI控件的点击功能&#xff0c;主要涉及手部追踪、坐标映射和手势检测三个核心环节。 实现步骤 初始化Kinect与关节追踪 使用KinectManager获取用户ID和手部关节点&#xff08;如JointType.HandLeft&#xff09;的坐标。 long userId _…...

QinQ项展 VLAN 空间

随着以太网技术在网络中的大量部署&#xff0c;利用 VLAN 对用户进行隔离和标识受到很大限制。因为 IEEE802.1Q 中定义的 VLAN Tag 域只有 12 个比特&#xff0c;仅能表示 4096 个 VLAN&#xff0c;无法满足城域以太网中标识大量用户的需求&#xff0c;于是 QinQ 技术应运而生。…...

OBS虚拟背景深度解析:无需绿幕也能打造专业教学视频(附插件对比)

想要录制教学视频却苦于背景杂乱&#xff1f;本文将手把手教你用OBS实现专业级虚拟背景效果&#xff0c;无需绿幕也能轻松营造沉浸式教学场景。文末附6个提升画面质感的免费背景资源&#xff01; 一、虚拟背景的核心价值&#xff1a;从「教师宿舍」到「虚拟讲堂」的蜕变 我们调…...

26考研——图(6)

408答疑 文章目录 一、图的基本概念二、图的存储三、图的遍历四、图的应用五、图的代码实操六、参考资料鲍鱼科技课件26王道考研书 七、总结图的存储结构邻接矩阵邻接表 图的遍历图的相关概念完全图和连通图图的连通性 关键路径学习建议 一、图的基本概念 文章链接: link 二、…...

Redis常用数据类型深度解析:从理论到最佳实践

Redis常用数据类型深度解析&#xff1a;从理论到最佳实践 一、引言二、Redis数据类型全景图三、核心数据类型详解**1. String&#xff08;字符串&#xff09;****2. Hash&#xff08;哈希表&#xff09;****3. List&#xff08;列表&#xff09;****4. Set&#xff08;集合&…...

DeepSeek-V3 模型更新,加量不加价

DeepSeek V3-0324 是 DeepSeek V3 系列的重要升级版本&#xff0c;虽然被官方称为「小版本迭代」&#xff0c;但其在技术能力、开源策略和用户体验上均有显著提升。以下是主要新特性功能和核心变化&#xff1a; 推理能力 基准测试性能显著提升&#xff1a; MMLU-Pro&#xff1…...

Vue项目的 Sass 全局基础样式格式化方案,包含常见元素的样式重置

步骤 1&#xff1a;创建全局样式文件 在项目中创建文件&#xff1a;src/assets/scss/global.scss 内容如下&#xff1a; // 全局盒模型设定&#xff08;边框计入宽高&#xff09; *, *::before, *::after {box-sizing: border-box;margin: 0;padding: 0; }// 基础元素样式重置…...

【Spring篇】Spring的生命周期

一、Bean 生命周期的核心阶段 1. 实例化&#xff08;Instantiation&#xff09; • 触发时机&#xff1a;容器启动时&#xff08;单例 Bean&#xff09;或请求时&#xff08;原型 Bean&#xff09;。 • 实现方式&#xff1a; 通过反射&#xff08;Class.newInstance() 或构造…...

Qt中通过QLabel实时显示图像

Qt中的QLabel控件用于显示文本或图像&#xff0c;不提供用户交互功能。以下测试代码用于从内置摄像头获取图像并实时显示&#xff1a; Widgets_Test.h&#xff1a; class Widgets_Test : public QMainWindow {Q_OBJECTpublic:Widgets_Test(QWidget *parent nullptr);~Widgets…...

[数据结构]1.时间复杂度和空间复杂度

这里写目录标题 1. 算法复杂度2. 时间复杂度2.1 执行次数2.2 大O渐进表示法2.3 常见时间复杂度计算eg1eg2eg3eg4eg5eg6eg7eg8eg9 3. 空间复杂度eg1eg2eg3eg4 4. 常见复杂度对比5. 复杂度练习eg1 1. 算法复杂度 衡量一个算法的好坏&#xff0c;一般是从时间空间两个维度来衡量&…...

【每日算法】Day 6-1:哈希表从入门到实战——高频算法题(C++实现)

摘要 &#xff1a;掌握高频数据结构&#xff01;今日深入解析哈希表的核心原理与设计实现&#xff0c;结合冲突解决策略与大厂高频真题&#xff0c;彻底掌握O(1)时间复杂度的数据访问技术。 一、哈希表核心思想 哈希表&#xff08;Hash Table&#xff09; 是一种基于键值对的…...

物联网平台架构介绍

物联网是连接物理设备、传感器、软件等的网络系统&#xff0c;使设备能够自动收集、交换和处理数据&#xff0c;实现智能化识别、定位、跟踪、监控和管理。随着物联网技术的飞速发展&#xff0c;物联网平台架构的设计变得至关重要&#xff0c;它决定了物联网系统的性能、可扩展…...

TCP/IP三次握手的过程,为什么要3次?

一&#xff1a;过程 第一次&#xff08;SYN&#xff09;&#xff1a; 客户端发送一个带有SYN标志的TCP报文段给服务器&#xff0c;设置SYN1&#xff0c;并携带初始序列号Seqx&#xff08;随机值&#xff09;&#xff0c;进入SYN_SENT状态。等待服务器相应。 第二次&#xff08…...

开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(四)

一、前言 语音转文本技术具有重要价值。它能提高信息记录和处理的效率,使人们可以快速将语音内容转换为可编辑、可存储的文本形式,方便后续查阅和分析。在教育领域,可帮助学生更好地记录课堂重点;在办公场景中,能简化会议记录工作。同时,该技术也为残障人士提供了便利,让…...

Qt开发:QInputDialog的使用

文章目录 一、QInputDialog的介绍二、 QInputDialog的基本用法三、使用 QInputDialog的实例四、QInputDialog的信号与槽 一、QInputDialog的介绍 QInputDialog 是 Qt 提供的一个对话框类&#xff0c;用于获取用户输入的文本、整数或浮点数。它提供了简单易用的静态方法和可定制…...

【系统架构设计师】软件质量管理

目录 1. 说明2. 软件质量保证2.1 说明2.2 质量保证的主要目标2.3 目标2.4 主要作用2.5 主要任务 3. 软件质量保证3.1 说明3.2 ISO 90003.3 CMM 4. 例题4.1 例题1 1. 说明 1.软件质量就是软件与明确地和隐含地定义的需求相一致的程度&#xff0c;更具体地说&#xff0c;软件质量…...

医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)

医院挂号预约小程序 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;医院管理 &#xff08;3&#xff09;医生管理 &#xf…...

UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法

有些差异 这么牛逼的引擎&#xff0c;居然有这种入门级别的问题&#xff0c;一触发清理&#xff0c;大概率(80%)会崩溃 无论虚幻5还是UE4都有这个问题&#xff0c;挺烦人的 实在忍不了了&#xff0c;这次&#xff0c;今天 就想问问有什么好的处理方法么&#xff1f;&#x…...

javaSE.多维数组

1 final 引用类型 final int[] arr 继承Object 的引用类型&#xff0c;不能改变引用的对象 存的其实是引用 数组类型数组&#xff0c;其实存的是引用 int [][] arr new int[][] { {1,2,3}, {4,5,6} };int [] a arr[0]; int [] b arr[1];...

Linux输入系统应用编程

什么是输入系统 Linux 输入系统是处理用户输入设备(如键盘、鼠标、触摸屏、游戏手柄等)的软件架构。在应用编程层面&#xff0c;它提供了与这些输入设备交互的接口。 主要组成部分 输入设备驱动层&#xff1a;直接与硬件交互的驱动程序 输入核心层&#xff1a;内核中的输入子…...

leetcode11.盛水最多的容器

双指针问题&#xff0c;指向前后边界&#xff0c;每次只移动高度较小的那个 class Solution { public:int maxArea(vector<int>& height) {int leftIndex0,rightIndexheight.size()-1;int result0;while(leftIndex<rightIndex){resultmax(result,(rightIndex-lef…...

ngx_http_index_loc_conf_t

定义在 src\http\modules\ngx_http_index_module.c typedef struct {ngx_array_t *indices; /* array of ngx_http_index_t */size_t max_index_len; } ngx_http_index_loc_conf_t; ngx_http_index_loc_conf_t 是 Nginx 中用于管理 index 指…...

[C++面试] 你了解视图吗?

一、入门 1、什么是 C 视图&#xff08;View&#xff09;&#xff1f;请简要说明其概念和用途 它提供了对序列&#xff08;如数组、容器等&#xff09;的非拥有性、只读或可写的访问。&#xff08;就像是个透明的放大镜&#xff0c;它能让你去看一组数据&#xff0c;但它自己…...

NetMizer-日志管理系统-远程命令执行漏洞挖掘

漏洞描述&#xff1a;NetMizer 日志管理系统 cmd.php中存在远程命令执行漏洞&#xff0c;攻击者通过传入 cmd参数即可命令执行 1.fofa搜素语句 title"NetMizer 日志管理系统" 2.漏洞验证 网站页面 验证POC /data/manage/cmd.php?cmdid...

UDP通信实现

一、Socket简介&#xff08;套接字) TCP/IP 五层网络模型的应用层编程接口称为Socket API, Socket( 套接字 ) &#xff0c;它是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换…...

Browserlist 使用指南:应对浏览器兼容性问题的解决方案

前言 在前端开发中&#xff0c;我们经常需要处理各种不同的浏览器兼容性问题。每个浏览器的版本众多&#xff0c;处理这些问题可能会让人感到头疼。幸运的是&#xff0c;有一个名为 Browserlist 的工具可以大大简化这项工作。本文将介绍 Browserlist 的作用和使用方法&#xf…...

[蓝桥杯 2023 省 A] 异或和之和

题目来自洛谷网站&#xff1a; 暴力思路&#xff1a; 先进性预处理&#xff0c;找到每个点位置的前缀异或和&#xff0c;在枚举区间。 暴力代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 1e520;int n; int arr[N…...