MySQL 从入门到精通(五):索引深度解析 —— 性能优化的核心武器
目录
一、索引概述:数据库的 “目录”
1.1 什么是索引?
1.2 索引的性能验证:用事实说话
实验环境准备
无索引查询耗时
有索引查询耗时
索引的 “空间换时间” 特性
二、索引的创建:三种核心方式
2.1 方式 1:CREATE INDEX(已存在表上创建)
2.2 方式 2:ALTER TABLE(添加索引)
2.3 方式 3:创建表时直接定义索引
三、索引的查看与分析:诊断性能的关键
3.1 查看索引的 4 种方法
方法 1:SHOW CREATE TABLE
方法 2:SHOW INDEX FROM
方法 3:EXPLAIN 分析查询计划
方法 4:查询系统表(高级)
四、索引的分类:从不同维度理解
4.1 按数据结构分类(物理存储方式)
4.2 按字段数量分类
4.3 按功能逻辑分类(最常见的面试考点)
4.4 按存储方式分类
五、索引的底层原理:为什么是 B+Tree?
5.1 为什么不选其他数据结构?
5.2 B+Tree 的核心优势
六、索引的优劣分析:权衡利弊
6.1 索引的优势
6.2 索引的弊端
七、索引设计原则:从实战中总结
7.1 必建索引的场景
7.2 避免索引的场景
7.3 其他最佳实践
八、练习与作业:动手实践
8.1 练习 1:创建带索引的表
8.2 练习 2:删除冗余索引
一、索引概述:数据库的 “目录”
1.1 什么是索引?
在数据库中,索引是一种特殊的 “数据结构文件”,它通过对表中一列或多列的值进行排序,从而加速数据的查询速度。
举个生活化的例子:查字典时,我们通过 “拼音目录” 或 “部首目录” 快速定位目标汉字,而不需要逐页翻查。数据库索引的作用类似 —— 它将表中的关键数据(如id
、name
)按特定规则排序存储,当执行WHERE
、JOIN
等查询时,数据库无需扫描全表,而是通过索引快速定位目标数据。
1.2 索引的性能验证:用事实说话
为了直观感受索引的作用,我们通过一个经典实验验证:
实验环境准备
-- 创建数据库
CREATE DATABASE mydb13_indexdb;
USE mydb13_indexdb;-- 创建无索引的student表
CREATE TABLE student(id INT, name VARCHAR(64), age INT(2)
);-- 插入百万级数据(通过自复制快速扩容)
INSERT INTO student VALUES(1,'das',20),(2,'dasdas',19),(3,'dsfsfsd',18),(4,'bbggbbg',22),(5,'eeeee',19);
INSERT INTO student SELECT * FROM student; -- 多次执行,直到数据量达到百万级
无索引查询耗时
插入一条测试数据后查询:
INSERT INTO student VALUES(666,'andy',40);
SELECT * FROM student WHERE id=666;
输出结果:
1 row in set (2.75 sec)
(查询耗时 2.75 秒,全表扫描效率极低)
有索引查询耗时
为id
字段创建索引后再次查询:
CREATE INDEX id_index ON student(id); -- 创建索引(耗时12.13秒)
SELECT * FROM student WHERE id=666;
输出结果:
1 row in set (0.00 sec)
(查询耗时几乎为 0,性能提升约 275 万倍!)
索引的 “空间换时间” 特性
创建索引前,student
表文件大小约 120MB;创建索引后,文件增大至 164MB。这是因为索引需要额外存储排序后的数据结构(如 B+Tree),但牺牲少量空间换取查询性能的大幅提升,在 “读多写少” 的业务场景中是非常划算的。
二、索引的创建:三种核心方式
2.1 方式 1:CREATE INDEX(已存在表上创建)
语法:
CREATE [UNIQUE] INDEX index_name
ON table_name (column_name(length) [ASC|DESC]);
UNIQUE
(可选):创建唯一索引(字段值不可重复)。index_name
:索引名称(建议用 “字段名 + index” 的命名规则,如id_index
)。table_name
:目标表名。column_name
:要索引的字段名。length
(可选):若字段是长文本(如VARCHAR(255)
),可指定前length
个字符作为索引(减少索引大小)。ASC/DESC
(可选):索引排序方式(默认ASC
升序)。
示例:
-- 创建普通索引(按name字段前10个字符索引)
CREATE INDEX name_index ON student(name(10));-- 创建唯一索引(id字段值必须唯一)
CREATE UNIQUE INDEX id_unique_index ON student(id);
2.2 方式 2:ALTER TABLE(添加索引)
语法:
ALTER TABLE table_name
ADD [UNIQUE] INDEX index_name (column_name(length) [ASC|DESC]);
示例:
-- 为age字段添加普通索引
ALTER TABLE student ADD INDEX age_index (age);-- 为name和age字段添加联合索引(多列索引)
ALTER TABLE student ADD INDEX name_age_index (name, age);
2.3 方式 3:创建表时直接定义索引
语法:
CREATE TABLE table_name (column1 INT,column2 VARCHAR(20),-- 普通索引INDEX index_name (column1),-- 唯一索引UNIQUE INDEX unique_index (column2),-- 主键索引(特殊的唯一索引,非空)PRIMARY KEY (column1)
);
注意:
- 主键索引(
PRIMARY KEY
)必须在创建表时指定,且字段需设置NOT NULL
。 - 多列索引需按顺序定义(如
(name, age)
),查询时只有使用第一个字段才会触发索引(“最左匹配原则”)。
示例:
-- 创建表时定义普通索引和主键索引
CREATE TABLE workinfo(id INT(10) NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL,type VARCHAR(10),PRIMARY KEY (id), -- 主键索引(自动唯一且非空)INDEX name_index (name(10)) -- 普通索引(name前10字符)
);
三、索引的查看与分析:诊断性能的关键
3.1 查看索引的 4 种方法
方法 1:SHOW CREATE TABLE
语法:
SHOW CREATE TABLE table_name \G;
输出示例:
CREATE TABLE `student` (`id` int DEFAULT NULL,`name` varchar(64) DEFAULT NULL,`age` int DEFAULT NULL,KEY `id_index` (`id`) -- 显示索引信息
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
方法 2:SHOW INDEX FROM
语法:
SHOW INDEX FROM table_name \G;
输出字段解析(以student
表的id_index
为例):
字段名 | 含义 | 示例值 |
---|---|---|
Table | 索引所属的表名 | student |
Non_unique | 是否非唯一索引(0 = 唯一,1 = 非唯一) | 1 |
Key_name | 索引名称 | id_index |
Seq_in_index | 多列索引中字段的顺序(单列索引为 1) | 1 |
Column_name | 索引关联的字段名 | id |
Cardinality | 索引的基数(估计的唯一值数量,值越大索引效果越好) | 1000000 |
Sub_part | 字段中用于索引的字符长度(NULL 表示全字段) | NULL |
Index_type | 索引类型(如BTREE 、HASH ) | BTREE |
方法 3:EXPLAIN 分析查询计划
语法:
EXPLAIN SELECT * FROM table_name WHERE condition \G;
关键字段:
possible_keys
:可能使用的索引(未使用时为NULL
)。key
:实际使用的索引(核心性能指标)。rows
:扫描的行数(值越小性能越好)。
示例:
EXPLAIN SELECT * FROM student WHERE id=666 \G;
输出中key
字段显示id_index
,说明查询使用了索引;若key
为NULL
,则表示全表扫描。
方法 4:查询系统表(高级)
通过mysql.innodb_index_stats
系统表查看索引统计信息:
-- 查看指定数据库的所有索引
SELECT * FROM mysql.innodb_index_stats
WHERE database_name = 'mydb13_indexdb';-- 查看指定表的索引
SELECT * FROM mysql.innodb_index_stats
WHERE database_name = 'mydb13_indexdb' AND table_name = 'student';
四、索引的分类:从不同维度理解
4.1 按数据结构分类(物理存储方式)
MySQL 支持 4 种索引结构,最常用的是B+Tree
:
类型 | 特点 | 适用场景 |
---|---|---|
B+Tree | 所有数据存储在叶子节点,支持范围查询和排序,InnoDB 默认结构 | 常规查询、排序、分组 |
Hash | 通过哈希函数计算值的存储位置,查询速度极快但无法范围查询 | 等值查询(如WHERE id=1 ) |
R-Tree | 空间索引,用于存储地理坐标等空间数据 | GIS 系统(如地图位置查询) |
T-Tree | 适用于内存数据库,支持高并发写入 | MySQL Cluster 集群场景 |
4.2 按字段数量分类
- 单列索引:基于单个字段创建(如
INDEX (name)
)。 - 多列索引(联合索引):基于多个字段创建(如
INDEX (name, age)
),需遵循 “最左匹配原则”(只有查询条件包含前导字段时才会触发索引)。
4.3 按功能逻辑分类(最常见的面试考点)
类型 | 特点 | 示例 |
---|---|---|
普通索引 | 加速查询,无唯一性约束 | INDEX (name) |
唯一索引 | 加速查询 + 保证字段值唯一(允许NULL ) | UNIQUE INDEX (email) |
主键索引 | 特殊的唯一索引(不允许NULL ),一张表只能有一个 | PRIMARY KEY (id) |
全文索引 | 用于文本内容的模糊搜索(MyISAM 引擎支持,InnoDB 5.6 + 支持) | FULLTEXT INDEX (content) |
空间索引 | 存储和查询空间数据(如点、线、多边形) | SPATIAL INDEX (location) |
4.4 按存储方式分类
-
聚簇索引(聚集索引):
索引数据与表数据存储在一起(物理连续),一张表仅有一个聚簇索引(通常是主键)。
优点:查询效率极高(直接定位数据);
缺点:插入顺序影响性能(非顺序插入会导致页分裂)。 -
非聚簇索引(二级索引):
索引数据与表数据分开存储,通过 “键值 + 行指针” 关联。
优点:支持多字段索引;
缺点:可能需要 “回表”(先查索引,再查原表)。
五、索引的底层原理:为什么是 B+Tree?
5.1 为什么不选其他数据结构?
- Hash 索引:虽然等值查询快,但无法排序和范围查询(如
WHERE age>20
)。 - 二叉树:可能退化为链表(如所有节点只有右子树),导致查询时间复杂度从
O(logN)
变为O(N)
。 - 平衡二叉树(AVL):插入 / 删除时需要频繁旋转调整,维护成本高,且单节点存储数据少(磁盘 IO 次数多)。
5.2 B+Tree 的核心优势
B+Tree 是 B-Tree 的变种,其核心设计如下:
- 所有数据存储在叶子节点(非叶子节点仅存索引),叶子节点通过指针连接(支持范围查询)。
- 非叶子节点可以存储更多索引键(通过增加子节点数降低树的高度),减少磁盘 IO 次数。
InnoDB 的 B+Tree 实现:
- 叶子节点存储完整数据(聚簇索引)或主键值(非聚簇索引)。
- 单个节点大小为 16KB(InnoDB 默认页大小),可存储大量索引键(如
INT
类型可存约 4000 个键)。
六、索引的优劣分析:权衡利弊
6.1 索引的优势
- 查询速度提升:百万级数据查询从秒级到毫秒级(如前文实验)。
- 唯一性约束:唯一索引可替代
UNIQUE
约束,避免重复数据。 - 排序 / 分组加速:索引已排序,
ORDER BY
和GROUP BY
无需额外扫描。 - 连表查询优化:主外键字段的索引可大幅减少 JOIN 时的扫描行数。
6.2 索引的弊端
- 空间占用:索引文件可能占原表空间的 20%-50%(如 120MB 的表可能需要 164MB 的索引)。
- 写入性能下降:插入 / 更新 / 删除时需同步维护索引(B+Tree 的分裂、合并操作)。
- 过度索引风险:索引越多,维护成本越高,可能导致写入性能骤降。
七、索引设计原则:从实战中总结
7.1 必建索引的场景
- 高频查询字段:如
WHERE
、JOIN
、ORDER BY
中的字段。 - 唯一性高的字段:如用户
id
(基数大,索引效果好)。 - 排序 / 分组字段:索引已排序,避免全表扫描后再排序。
7.2 避免索引的场景
- 低基数字段:如 “性别”(只有
男/女
),索引无法有效过滤数据。 - 频繁更新的字段:如订单状态(
待支付/已支付
),索引维护成本高。 - 长文本字段:如
TEXT
类型,建议使用前缀索引(如前 10 个字符)。
7.3 其他最佳实践
- 限制索引数量:单表索引数建议不超过 5 个(过多索引影响写入)。
- 多列索引的顺序:将高频查询字段、高基数字段放在前面(如
(name, age)
优于(age, name)
)。 - 定期清理冗余索引:通过
SHOW INDEX
检查未使用的索引(Cardinality
低的索引可删除)。
八、练习与作业:动手实践
8.1 练习 1:创建带索引的表
需求:新建数据库mydb14_job
,创建workinfo
表,要求:
id
字段为主键,自增,唯一索引(降序)。name
字段创建长度为 10 的普通索引。type
和address
字段创建联合索引。
实现步骤:
-- 创建数据库
CREATE DATABASE mydb14_job;
USE mydb14_job;-- 创建表并定义索引
CREATE TABLE workinfo(id INT(10) NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL,type VARCHAR(10),address VARCHAR(50),wage INT,content TINYTEXT,extra TEXT,PRIMARY KEY (id), -- 主键索引(聚簇索引)UNIQUE INDEX index_id (id DESC), -- 唯一索引(降序)INDEX index_name (name(10)), -- 普通索引(前缀10字符)INDEX index_t (type, address) -- 联合索引
);-- 验证索引
SHOW INDEX FROM workinfo \G;
8.2 练习 2:删除冗余索引
需求:删除workinfo
表的index_id
唯一索引。
DROP INDEX index_id ON workinfo;
下一篇预告:《MySQL 从入门到精通(七):视图全面详解 —— 虚拟表的灵活运用》,将深入讲解视图的创建、更新、修改与删除,以及如何通过视图简化复杂查询、提升数据安全性。
相关文章:
MySQL 从入门到精通(五):索引深度解析 —— 性能优化的核心武器
目录 一、索引概述:数据库的 “目录” 1.1 什么是索引? 1.2 索引的性能验证:用事实说话 实验环境准备 无索引查询耗时 有索引查询耗时 索引的 “空间换时间” 特性 二、索引的创建:三种核心方式 2.1 方式 1:C…...
湖北理元理律师事务所:债务优化如何实现还款与生活的平衡?
债务压力往往让债务人陷入“还款还是生存”的两难选择。湖北理元理律师事务所通过案例实践发现,科学规划的核心在于平衡法律义务与基本生活保障,而非单纯追求债务缩减。本文结合实务经验,解析债务优化的可行路径。 刚性需求优先:…...
Day21 奇异值分解(SVD)全面解析
一、奇异值分解概述 奇异值分解是线性代数中一个重要的矩阵分解方法,对于任何矩阵,无论是结构化数据转化成的“样本 * 特征”矩阵,还是天然以矩阵形式存在的图像数据,都能进行等价的奇异值分解(SVD)。 二…...
【vue】vuex实现组件间数据共享 vuex模块化编码 网络请求
目录 一、vuex实现组件间数据共享 二、 vuex模块化编码 三、网络请求 模块化命名空间小结: 总结不易~ 本章节对我有很大的收获, 希望对你也是!!! 本节素材已上传Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.…...
红黑树删除的实现与四种情况的证明
🧭 学习重点 删除节点的三种情况红黑树如何恢复性质四种修复情况完整可运行的 C 实现 一、红黑树删除的基础理解 红黑树删除比插入复杂得多,因为: 删除的是黑节点可能会破坏“从根到叶子黑节点数相等”的性质。删除红节点无需修复…...
FHE与后量子密码学
1. 引言 近年来,关于 后量子密码学(PQC, Post-Quantum Cryptography) 的讨论愈发热烈。这是因为安全专家担心,一旦有人成功研发出量子计算机,会发生什么可怕的事情。由于 Shor 算法的存在,量子计算机将能够…...
使用FastAPI和React以及MongoDB构建全栈Web应用04 MongoDB快速入门
一、NoSQL 概述 1.1 了解关系数据库的局限性 Before diving into NoSQL, it’s essential to understand the challenges posed by traditional Relational Database Management Systems (RDBMS). While RDBMS have been the cornerstone of data management for decades, th…...
C++:this指针
class date { public:void f(int i){} } 以上是我们定义的一个简单的类,这个类里面含有一个简单的成员函数,成员函数看似只有一个参数,实际上是两个参数,除了参数i以外,还有一个指向调用该函数的对象的指针——this指…...
如何在postman使用时间戳
1. 使用 Pre-request Script 动态转换 在发送请求前,将日期字符串转为时间戳并存储为环境变量/全局变量。 示例代码 // 将日期字符串(如 "2023-10-01")转为时间戳(毫秒) const dateString "2…...
OCP开闭原则
OCP,software entities(modules,classes,functions,etc.)should be openfor extension, but closed for modification. 软件实体(模块、类和方法等)应该对扩展开发,对修改关闭。 OCP特点 提高可扩展性:新功能通过添…...
计算机网络:什么是Mesh组网以及都有哪些设备支持Mesh组网?
Mesh组网技术详解与实现工具推荐 Mesh组网是一种通过多个节点路由器协同工作,形成覆盖全屋的无线网络的技术。它通过动态路径调整、无缝漫游和自愈能力,解决传统单一路由器覆盖不足的问题,尤其适合大户型、多层住宅或复杂户型环境。以下是Mesh组网的核心原理、实现方式及推…...
STM32f103 标准库 零基础学习之点灯
前提:你已经下好了标准外设库,如果没有可以去找找教程 ST官网上可以下载 目录 前提:你已经下好了标准外设库,如果没有可以去找找教程 ST官网上可以下载 点灯逻辑 1. 定义 GPIO 初始化结构体 2. 开启GPIOA的时钟…...
uniapp使用ui.request 请求流式输出
正文: 在现代Web开发中,实时数据流和长时间运行的请求变得越来越常见,尤其是在处理大量数据或进行实时通信时。在这种情况下,uniapp 提供的 ui.request 请求方法可以帮助我们轻松实现流式输出请求。本文将介绍如何使用 uni.reques…...
MATLAB安装常见问题及解决方案详解(含代码示例)
MATLAB作为科学计算和工程分析的核心工具,其安装过程可能因操作系统版本、硬件配置或网络环境等因素而出现各种问题。本文基于MATLAB官方文档和社区经验,系统总结了安装过程中常见的问题,并提供详细的解决方案和代码示例,帮助用户…...
【Java ee初阶】网络编程 UDP socket
网络编程 socket api 是传输层提供的api。 UDP 无连接,不可靠传输,面向数据报,全双工。 TCP 有链接,可靠传输,面向字节流,全双工。 UDP socket api 数据报 DatagrammSocket 代表了操作系统中的socket文…...
BeanPostProcessor和AOP
BeanPostProcessor Spring中有一个接口Oredr的getOrder()方法,这个方法返回值是一个int类型,Spring容器会根据这个方法的返回值 对容器的多个Processor对象从小到大排序,创建Bean时候依次执行他们的方法,也就是说getOrder()方法的…...
django的权限角色管理(RBAC)
在 Django 中,User、Group 和 Permission 是权限系统的核心组件。下面通过代码示例演示它们的 CRUD(创建、读取、更新、删除) 操作: 一、User 模型 CRUD from django.contrib.auth.models import User# 创建用户 user User.obje…...
vue vite 无法热更新问题
一、在vue页面引入组件CustomEmployeesDialog,修改组件CustomEmployeesDialog无法热更新 引入方式: import CustomEmployeesDialog from ../dialog/customEmployeesDialog.vue 目录结构: 最后发现是引入import时,路径大小写与目…...
IBM BAW(原BPM升级版)使用教程第八讲
续前篇! 一、流程开发功能模块使用逻辑和顺序 前面我们已经对 流程、用户界面、公开的自动化服务、服务、事件、团队、数据、性能、文件各个模块进行了详细讲解,现在统一进行全面统一讲解。 在 IBM Business Automation Workflow (BAW) 中,…...
202534 | KafKa简介+应用场景+集群搭建+快速入门
Apache Kafka 简介 一、什么是 Kafka? Apache Kafka 是一个高吞吐量、分布式、可扩展的流处理平台,用于构建实时数据管道和流应用程序。它最初由 LinkedIn 开发,并于 2011 年开源,目前由 Apache 软件基金会进行维护。 Kafka 具备…...
[思维模式-25]:《本质思考力》-6- 马克思主义哲学的五对基本哲学范畴,以及在计算机领域的体现
一、马克思主义哲学的五对基本哲学范畴, 马克思主义哲学的五对基本哲学范畴是内容与形式、现象与本质、原因与结果、必然性与偶然性、可能性与现实性,以下为具体分析: 内容与形式:组成元素 VS 组成结构 内容指构成事物内在要素的…...
6. 存储池配置与CephFS创建 ceph version 14.2.22
6. 存储池配置与CephFS创建 6.1 CRUSH规则管理6.2 纠删码配置6.3 为SSD和HDD创建专用CRUSH规则6.4 创建CephFS存储池6.5 验证存储池配置记录OSD盘符 所有节点都执行 7. 客户端挂载CephFS7.1 Ubuntu客户端配置7.2 使用内核驱动挂载7.3 设置开机自动挂载 说明:配置Cep…...
RocketMQ Kafka区别
架构 ZooKeeper:管理 Broker 注册、分区 Leader 选举及消费者组状态。Broker:存储 Partition数据,每个 Partition 为独立日志文件。Producer/Consumer:通过 ZooKeeper获取路由信息,实现消息分发与消费。 NameServer&am…...
linux和linux 、linux和windows实现文件复制笔记
前提:两设备得在同一局域网下,且启用了ssh 一、linux和linux实现文件复制 从 Ubuntu B 复制文件夹到 Ubuntu A 在 Ubuntu A 上打开终端,执行: scp -r userBubuntuB_IP:/home/userB/folder_to_copy /home/userA/destination/ 二、linux和…...
Flink 运维监控与指标采集实战
一、引言:实时任务为什么必须监控? 在实时任务中,任务失败、数据延迟、资源瓶颈往往并非由明显的代码异常引发,而是隐蔽地潜藏在: Kafka 积压无告警 Flink Checkpoint 卡顿却无人知晓 反压、TaskManager 内存 OOM 未实时感知 为了保障业务 SLA、高可用与可观测性,构建完…...
linux 开发小技巧之git增加指令别名
众所周知,git的指令执行时都得敲好几个字符才能补充上来,比如常用的git status,是不是要将全部的字符一个个地在键盘敲上来,有没有更懒惰点办法,可以将经常用到的git命令通过其他的别名的方式填充,比如刚刚…...
【八股消消乐】项目中如何优化JVM内存分配?
😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本专栏《八股消消乐》旨在记录个人所背的八股文,包括Java/Go开发、Vue开发、系统架构、大模型开发、机器学习、深度学习、力扣算法等相关知识点,期待与你…...
操作系统实验习题解析 上篇
孤村落日残霞,轻烟老树寒鸦,一点飞鸿影下。 青山绿水,白草红叶黄花。 ————《天净沙秋》 白朴 【元】 目录 实验一: 代码: 解析: 运行结果: 实验二: 代码解析 1. 类设计 …...
Yocto中`${B}`变量的作用
在Yocto项目中,${B}是一个关键路径变量,用于指定构建目录(Build Directory),其作用是存放编译过程中生成的中间文件(如Makefile、目标文件、日志等),从而将构建产物与源码目录分离,保持源码环境的独立性^1。 具体解析: 定义与默认路径 默认情况下,${B}的路径为${TM…...
JDBC执行sql过程
1. 加载数据库驱动 JDBC 通过 驱动(Driver) 实现与不同数据库的通信。驱动需提前加载到 JVM: 手动加载(JDBC 4.0 前): Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱…...
python如何提取Chrome中的保存的网站登录用户名密码?
很多浏览器都贴心地提供了保存用户密码功能,用户一旦开启,就不需要每次都输入用户名、密码,非常方便。作为python脚本,能否拿到用户提前保存在浏览器中的用户名密码,用以自动登录呢?必须有,小爬…...
【数据结构入门训练DAY-30】数的划分
文章目录 前言一、题目二、解题思路结语 前言 本次训练内容 训练DFS。训练解题思维。 一、题目 将整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。 例如:n7,k3,下面三种分法被认为是相同的。 {1&a…...
CD37.【C++ Dev】string类的模拟实现(上)
目录 1.string基本知识的回顾 2.简单的模拟实现 准备操作 代码实现 成员变量 构造函数 C风格构造的函数 无参构造函数 C风格构造的函数与无参构造函数合二为一 析构函数 c_str() size() operator[ ] 可读可写 只可读 iterator(指针版) begin()和end() 编辑…...
Java代理
一、代理的基本定义 1.什么是Java代理模式:给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用。 2.类是构建对象的模板 下面是最简单的代理实现(这只是一个演示会报错) package 代理;public class xiaoming {public static…...
源码示例:使用SpringBoot+Vue+ElementUI+UniAPP技术组合开发一套小微企业ERP系统
目录 一、系统架构设计 1、技术分层 2、开发环境 二、快速开发实践 1、后端搭建(Spring Boot) 2、前端管理端(VueElementUI) 3、移动端开发(UniAPP) 三、关键集成方案 1、统一接口处理 2、跨平台…...
.Net Mqtt协议-MQTTNet(一)简介
一、MQTTNet 简介 MQTTnet 是一个高性能的MQTT类库,支持.NET Core和.NET Framework。 二、MQTTNet 原理 MQTTnet 是一个用于.NET的高性能MQTT类库,实现了MQTT协议的各个层级,包括连接、会话、发布/订阅、QoS(服务质量࿰…...
路由策略和策略路由的区别以及配置案例
区别 路由策略:路由策略是通过ACL等方式控制路由发布,让对方学到适当路由条目,比如有20条路由,只想让某个路由器学到10条,可以通过路由策略进行过滤。 策略路由:策略路由是通过定义策略和应用,…...
【Debian】关于LubanCat-RK3588s开发板安装Debian的一些事
琐碎的事问题不少,甚至一度让我以为核心坏了 按照指引烧录完Debian11-gnome镜像后启动,此时输出的分辨率不一定匹配显示器,进而导致黑屏,此时需要使用MobaXterm的串口终端以运行一些指令,下载链接用xrandr指令查看显示…...
vmware环境ORACLE RAC环境数据库节点1无法启动问题分析处理
近期在一个客户数据库巡检时发现ORACLE RAC环境数据库一节点故障,只有二节点在运行。 RAC环境正常安装完成后,后期典型的节点无法启动问题就是私网异常、共享存储异常等,检查机器日志可以快速定位问题;本次问题就是因为心跳网络问…...
前端性能优化全攻略:从基础体验到首屏加载的深度实践
在移动互联网时代,用户体验已成为产品竞争力的核心要素。本文将从基础交互优化和首屏加载专项两个维度,系统梳理前端性能优化的关键策略。(对应图片1的整体框架设计) 一、基础性能优化四维模型 1. 首次打开加速方案 • 资源压缩…...
选对第三方软件测试公司,项目验收成功率提升90%
在当今数字化浪潮中,软件质量已成为企业竞争力的核心要素。然而,软件开发团队往往因资源有限或视角局限,难以全面发现潜在问题。这时,第三方软件测试公司凭借其独立性和专业性,成为企业确保软件质量的关键伙伴。尤其在…...
golang常用库之-protojson 库(json.Marshal 和 protojson.Marshal 序列化对比)
文章目录 golang常用库之-protojson 库(json.Marshal 和 protojson.Marshal 序列化对比)什么是protojson 库什么情况需要用 protojson? json.Marshal 和 protojson.Marshal 序列化对比简单示例json.Marshal 的潜在问题 (对于 Protobuf 结构体…...
嵌入式学习笔记 - 运算放大器的共模抑制比
一 定义 共模抑制比(Common Mode Rejection Ratio, CMRR)是衡量差分放大器(或差分电路)抑制共模信号能力的关键指标。它在电子工程中尤为重要,特别是在需要处理微弱信号或对抗环境噪声的场景中。 核心概念 共…...
Taccel:一个高性能的GPU加速视触觉机器人模拟平台
触觉感知对于实现人类水平的机器人操作能力至关重要。而视觉触觉传感器(VBTS)作为一种有前景的解决方案,通过相机捕捉弹性凝胶垫的形变模式来感知接触的方式,为视触觉机器人提供了高空间分辨率和成本效益。然而,这些传…...
高效Python开发:uv包管理器全面解析
目录 uv简介亮点与 pip、pip-tools、pipx、poetry、pyenv、virtualenv 对比 安装uv快速开始uv安装pythonuv运行脚本运行无依赖的脚本运行有依赖的脚本创建带元数据的 Python 脚本使用 shebang 创建可执行文件使用其他package indexes锁定依赖提高可复现性指定不同的 Python 版本…...
PyTorch 线性回归模型构建与神经网络基础要点解析
笔记 1 PyTorch构建线性回归模型 1.1 创建数据集 import torch from torch.utils.data import TensorDataset # 创建x和y张量数据集对象 from torch.utils.data import DataLoader # 创建数据集加载器 import torch.nn as nn # 损失函数和回归函数 from torch.optim impo…...
PyTorch API 2 - 混合精度、微分、cpu、cuda、可视化
文章目录 自动混合精度包 - torch.amp自动类型转换参数说明 梯度缩放自动转换操作符参考操作符适用性CUDA 操作特定行为可自动转换为 float16 的 CUDA 运算可自动转换为 float32 的 CUDA 运算提升至最宽输入类型的 CUDA 操作优先使用 binary_cross_entropy_with_logits 而非 bi…...
window 显示驱动开发-AGP 类型伸缩空间段
AGP 类型的伸缩空间段类似于线性光圈空间段。 但是,内核模式显示微型端口驱动程序(KMD)不会通过 AGP 类型的伸缩空间段公开 dxgkDdiBuildPagingBuffer 回调函数的DXGK_OPERATION_MAP_APERTURE_SEGMENT和DXGK_OPERATION_UNMAP_APERTURE_SEGMEN…...
异地多活单元化架构下的微服务体系
治理服务间的跨IDC调用,而数据库层面还是要跨IDC 服务注册中心拆开、 金融要求,距离太远,异地备库,如果延迟没读到数据就可能有资损,IDC3平时不能用,IDC1挂了还是有数据同步问题,IDC3日常维护…...
LinkedList源码解析
添加元素方法 add方法详解 /*E:创建LinkedList对象时泛型中设置好的数据类型e: 传递的参数boolean: 添加成功即为true,添加失败即为false */public boolean add(E e) {// 在链表最后一个结点后面插入新结点(根据待插入元素封装的结点) linkLast(e);/…...