MySQL--索引入门
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
Mysql在存储数据之外,数据库系统各种还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级算法来快速找到我们想要的数据,而这种数据结构就是索引
简单理解为“排好序的可以快速查找数据的数据结构”。
索引就好比字典上的目录
索引概述
如果在查询的数据表没有索引,那么SQL语句查询会从第一条记录开始匹配判断,直至匹配成功,而数据库查询数据是从磁盘查询的,每一次匹配都是一次IO流操作,这样的查询被称为全表扫描,及其耗费性能!
有索引的情况下,以二叉树数据结构演示为例,如果现在表中有ID,NAME,AGE,三条属性,现在对AGE建立索引,那么就需要维护这样一个二叉树,当我们往这张表插入数据时,就需要维护二叉树的节点,这个节点是指向这一行数据的地址 如下图所示
然后我们就可以根据二叉树查找的算法来匹配数据,这种方法十分的高效。
注意事项:上述二叉树索引结构只是一个示意图,并不是真实的索引结构
索引优势
-
提高数据检索的效率,降低数据库的IO成本
-
通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗
索引劣势
索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用磁盘空间的。
在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件,每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息。
索引数据结构(一般都是指B-Tree)
介绍
MySQL的索引是在引擎层实现的,主要包含以下几种:
索引结构 | 描述 |
---|---|
B+Tree索引 | 最常见的索引类型,大部分引擎都支持B+树索引 |
Hash索引 | 底层数据使用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询 |
R-Tree(空间索引) | 是MyISAM存储引擎的一种特殊索引类型,主要用于管理地理空间类型,使用较少 |
Full-text(全文索引) | 是一种通过建立倒排索引,快速匹配文档的方式,类似于Lincene,Solr |
索引结构 | InnoDB | MySIAM | Memory |
---|---|---|---|
B+Tree索引 | 支持 | 支持 | 支持 |
Hash索引 | 不支持 | 不支持 | 支持 |
R-Tree(空间索引) | 不支持 | 支持 | 不支持 |
Full-text(全文索引) | 5.6版本支持 | 支持 | 不支持 |
平时大多数的索引,如果没有特别指明,都是指B+树结构组织的索引
索引结构
MySQL的数据是存储在磁盘中的,每次查询数据语句都需要将数据从磁盘中加载到内存中,,相当于进行了一次IO操作,而磁盘IO操作十分耗时,所以我们优化SQL的方向就是降低IO操作的次数,访问二叉树的每个节点就会发生一次IO,如果想要减少磁盘IO操作,就需要尽量降低树的高度。那如何降低树的高度呢?
-
二叉树
弊端:当极端情况下,数据递增插入是,会一直向右插入,形成链表,查询效率会降低
解决方法:红黑树是弱平衡树,通过红黑树解决树的平衡问题
但红黑树也是二叉树,也存在大数据量情况下,层级较深,检索速度慢
-
B-Tree(多路平衡查找树)
以一课最大度数(度数:一个节点的子节点个数)为5(5阶)的B-Tree为例(每个节点最多存储4个key,5个指针):
插入数据的变化过程:
该树为5阶B-Tree,一个节点有5个指针,4个key
首先插入234,345,23,899,现在这个节点已经有4个key,继续添加1200,节点已经不能装下了,树会发生裂变,中间元素向上分裂
则会变为
,继续添加1234,比345大,则会向右边插入,比1200大,则会放在1200的右边,再插入1500,还是放在右边,此时右边的节点已经已经有4个key了,继续添加1000,右边节点有5个key,继续分裂,中间元素向上分裂,1200为中间数,向上与345为同一个节点
,继续插入234,346,都放在左边,此时左边的节点已经已经有4个key了,继续插入12,中间元素向上分裂,123变为中间元素,向上分裂
,继续插入1567,1800,都放在右边,此时右边的节点已经已经有4个key了,继续插入1980,1567变为中间元素向上分裂
,现在上面的节点已经有4个key了,继续插入2000,1888,放在右边,此时右边的节点已经已经有4个key了,在插入2456,1980变成中间元素向上分裂,上面的节点也要在向上分裂,1200为中间元素向上分裂,最后得
,现在树的层级来到了三层,如果要存储数据,每一个数据是挂在key下的,
-
B+Tree
以一颗最大度数为4阶的B+tree为例:
插入数据变化过程:
该树为5阶B+Tree,一个节点有5个指针,4个key
首先插入232,234,567,1000,现在这个节点已经有4个key,在插入1234,中间元素向上分裂,即567向上分裂,B+树的所有元素都会出现在叶子节点上,
,继续插入1234,此时右边已经有4个key了,继续插入2345,中间元素1000向上分裂,
,插入100,200,在插入35,中间元素200向上分裂,
,以此类推,而下面链表的首元素就是向上分离的中间元素
MySQL索引中的B+Tree结构
参考博客:一文搞懂MySQL索引所有知识点(建议收藏)_一文搞懂mysql索引所有知识点 敖丙-CSDN博客
B树的缺点:
-
B树不支持范围查询的快速查找,你想想这么一个情况如果我们想要查找10和35之间的数据,查找到15之后,需要回到根节点重新遍历查找,需要从根节点进行多次遍历,查询效率有待提高。
-
如果data存储的是行记录,行的大小随着列数的增多,所占空间会变大。这时,一个页中可存储的数据量就会变少,树相应就会变高,磁盘IO次数就会变大。
Mysql索引数据结构对经典的B+Tree进行了优化,在原来的基础上,增加一个指向相邻叶子结点的链表指针,就形成了带有顺序指针的B+Tree,提高访问区间的性能。利于数据库中的排序
B+树的最底层叶子节点包含了所有的索引项。
从图上可以看到,B+树在查找数据的时候,由于数据都存放在最底层的叶子节点上,所以每次查找都需要检索到叶子节点才能查询到数据。
所以在需要查询数据的情况下每次的磁盘的IO跟树高有直接的关系,
但是从另一方面来说,由于数据都被放到了叶子节点,所以放索引的磁盘块锁存放的索引数量是会跟着增加的。
所以相对于B树来说,B+树的树高理论上情况下是比B树要矮的。也存在索引覆盖查询的情况,在索引中数据满足了当前查询语句所需要的全部数据,此时只需要找到索引即可立刻返回,不需要检索到最底层的叶子节点。
等值查询
假如我们查询值等于9的数据。查询路径磁盘块1->磁盘块2->磁盘块6。
-
第一次磁盘IO:将磁盘块1加载到内存中,在内存中从头遍历比较,9<15,走左路,到磁盘寻址磁盘块2。
-
第二次磁盘IO:将磁盘块2加载到内存中,在内存中从头遍历比较,7<9<12,到磁盘中寻址定位到磁盘块6。
-
第三次磁盘IO:将磁盘块6加载到内存中,在内存中从头遍历比较,在第三个索引中找到9,取出data,如果data存储的行记录,取出data,查询结束。如果存储的是磁盘地址,还需要根据磁盘地址到磁盘中取出数据,查询终止。(这里需要区分的是在InnoDB中Data存储的为行数据,而MyIsam中存储的是磁盘地址。)
范围查询
假如我们想要查找9和26之间的数据。查找路径是磁盘块1->磁盘块2->磁盘块6->磁盘块7。
-
首先查找值等于9的数据,将值等于9的数据缓存到结果集。这一步和前面等值查询流程一样,发生了三次磁盘IO。
-
查找到15之后,底层的叶子节点是一个有序列表,我们从磁盘块6,键值9开始向后遍历筛选所有符合筛选条件的数据。
-
第四次磁盘IO:根据磁盘6后继指针到磁盘中寻址定位到磁盘块7,将磁盘7加载到内存中,在内存中从头遍历比较,9<25<26,9<26<=26,将data缓存到结果集。
-
主键具备唯一性(后面不会有<=26的数据),不需再向后查找,查询终止。将结果集返回给用户。
可以看到B+树可以保证等值和范围查询的快速查找,MySQL的索引就采用了B+树的数据结构。
B+Tree和B-Tree的区别:
-
B树:非叶子节点和叶子节点都会存储数据。
-
B+树:只有叶子节点才会存储数据,非叶子节点只存储键值,起到索引的效果。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表。
Hash(哈希索引)
哈希索引是采用一定的Hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储到hash表上
如果两个(或多个)键值映射到一个相同的槽位上,他们就产生了hash冲突,可以通过链表来解决
-
特点
-
Hash索引只能用于对等比较(= ,in),不支持范围查询(between,>,<,....)
-
hash表是无序,无索引的,无法利用索引完成排序操作
-
查询效率高,通常指需要一次检查就可以了,效率通常高于B+Tree索引
-
-
存储引擎支持
在MySQL中,支持Hash索引的是Memory引擎,而InnoDB中具有自适应Hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的
面试题:为什么InnoDB存储引擎选择B+Tree索引结构?
-
相对于二叉树,层级更少,而层级意味着IO操作的多少,我们优化SQL的方向就是降低IO操作的次数,即降低树的高度(层级数)
-
B+树只有叶子节点存放数据,其余节点不存放,而一个节点就是MySQL中的一页(Page),而其余节点(Page)存放的指针和key也就增多,那么在相同数据量的情况下,B+树的层级更少,那么性能就越高,
-
且B树的范围匹配的效率很低,需要每次都返回根节点查询,而B+树在查询首个数据之后可以直接在叶子节点中遍历需要的数据,
-
相对于Hash索引,B+树支持范围匹配和排序操作
索引使用场景
推荐建立索引:
-
主键自动建立唯一索引
-
频繁作为查询条件的字段应该创建索引(where后面的语句)
-
查询中与其他表关联的字段,外键关系建立索引
-
多字段查询下 倾向创建联合索引
-
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
-
查询中 统计或者分组字段
不推荐建立索引:
-
表记录太少
-
经常增删改查
-
where条件里用不到的字段不建立索引
索引分类
分类 | 含义 | 特点 | 关键字 |
---|---|---|---|
主键索引 | 针对表中主键创建的索引 | 默认自动创建,只能有一个 | primary key |
唯一索引 | 避免同一个表中某数据列中重复 | 可以有多个 | unique |
常规索引 | 快速定位特定数据 | 可以有多个 | |
全文索引 | 全文索引查找的是文本中的关键词,而不是比较索引中的值 | 可以有多个 | fulltext |
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种
分类 | 含义 | 特点 |
---|---|---|
聚集索引(Clustered Index)(B+树) | 将数据存储与索引放在一块,索引结构的叶子节点保存了行数据 | 必须有。而且只能有一个 |
二级索引(辅助索引)(Secondary index) | 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键 | 可以存在多个 |
聚集索引的选举规则:
-
如果存在主键,主键索引就是聚集索引
-
如果没有主键,将使用第一个唯一索引作为聚集索引
-
如果表没有主键,或者没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。
聚集索引叶子节点存放的是行数据
二级索引中叶子节点存放的是指向聚集索引叶子节点的指针
聚集索引与二级索引的叶子节点存放的数据的关系就是指针与二级指针的关系
如下图:
如果查询的是name字段的话,那么数据库进行的就是回表查询
数据库会先走二级索引,通过二级索引找到对应的主键值,再根据主键值到聚集索引当中拿到行数据
思考:InnoDB主键索引的B+Tree高度为多高?
假设:一行数据大小为1k,一页中可以存储16行这样的数据,InnoDB的指针占用6个字节的空间,主键即使为bigint,占用字节数为8.
如果树的高度为2:
由于B+树只有叶子节点才存储数据
16 * 1024 = n * 8 +(n+1 )*6
得出:n = 1170,每一个节点的key为1171个
得出存储的记录为:11701* 16 * =18736
高度为3时
1171 * 1171 * 16 =21939386条记录
索引语法
-
创建索引
create [unique|fulltext] index index_name on table_name (index_col_name,...);
如果一个索引只关联一个字段,被称为单列索引。如果一个索引关联了多个字段,则被称为联合索引(组合索引)。
-
查看索引
show index from table_name
-
删除索引
drop index index_name on table_name
案例:
前置代码:
create database if not exists Demo;use Demo;create table if not exists `user`(`id` int(4) not null auto_increment comment 'ID',`name` varchar(20) not null comment '姓名',`phone` varchar(11) not null comment '电话号码',`email` varchar(20) default null comment '邮箱',`profession` varchar(20) default null comment '专业',`age` int(4) not null comment '年龄',`gender` tinyint(1) default null comment '性别,取值为0或1',`status` int(4) not null comment '状态 取值为0与6之间',`createTime` datetime not null comment '创建时间',primary key (`id`))engine = innodb default charset = utf8;INSERT INTO `user` (`name`, `phone`, `email`, `profession`, `age`, `gender`, `status`, `createTime`) VALUES('王伟', '13800138001', 'wangwei@example.com', '计算机科学', 25, 1, 1, '2023-01-01 10:00:00'),('李娜', '13800138002', 'lina@example.com', '软件工程', 28, 0, 3, '2023-01-02 11:00:00'),('张敏', '13800138003', 'zhangmin@example.com', '数据科学', 22, 0, 2, '2023-01-03 12:00:00'),('刘强', '13800138004', 'liuqiang@example.com', '人工智能', 30, 1, 6, '2023-01-04 13:00:00'),('陈静', '13800138005', 'chenjing@example.com', '网络安全', 26, 0, 4, '2023-01-05 14:00:00'),('杨光', '13800138006', 'yangguang@example.com', '计算机科学', 24, 1, 5, '2023-01-06 15:00:00'),('赵琳', '13800138007', 'zhaolin@example.com', '软件工程', 27, 0, 1, '2023-01-07 16:00:00'),('黄磊', '13800138008', 'huanglei@example.com', '数据科学', 29, 1, 0, '2023-01-08 17:00:00'),('吴芳', '13800138009', 'wufang@example.com', '人工智能', 23, 0, 2, '2023-01-09 18:00:00'),('周涛', '13800138010', 'zhoutao@example.com', '网络安全', 31, 1, 3, '2023-01-10 19:00:00'),('徐洋', '13800138011', 'xuyang@example.com', '计算机科学', 25, 1, 4, '2023-01-11 20:00:00'),('孙丽', '13800138012', 'sunli@example.com', '软件工程', 28, 0, 5, '2023-01-12 21:00:00'),('马超', '13800138013', 'machao@example.com', '数据科学', 22, 1, 6, '2023-01-13 22:00:00'),('朱婷', '13800138014', 'zhuting@example.com', '人工智能', 30, 0, 1, '2023-01-14 23:00:00'),('胡军', '13800138015', 'hujun@example.com', '网络安全', 26, 1, 2, '2023-01-15 10:00:00'),('林小燕', '13800138016', 'linxiaoyan@example.com', '计算机科学', 24, 0, 3, '2023-01-16 11:00:00'),('郭峰', '13800138017', 'guofeng@example.com', '软件工程', 27, 1, 4, '2023-01-17 12:00:00'),('何洁', '13800138018', 'hejie@example.com', '数据科学', 29, 0, 5, '2023-01-18 13:00:00'),('高翔', '13800138019', 'gaoxiang@example.com', '人工智能', 23, 1, 6, '2023-01-19 14:00:00'),('罗娟', '13800138020', 'luojuan@example.com', '网络安全', 31, 0, 0, '2023-01-20 15:00:00'),('郑凯', '13800138021', 'zhengkai@example.com', '计算机科学', 25, 1, 1, '2023-01-21 16:00:00'),('谢芳', '13800138022', 'xiefang@example.com', '软件工程', 28, 0, 2, '2023-01-22 17:00:00'),('董明', '13800138023', 'dongming@example.com', '数据科学', 22, 1, 3, '2023-01-23 18:00:00'),('萧红', '13800138024', 'xiaohong@example.com', '人工智能', 30, 0, 4, '2023-01-24 19:00:00'),('曹阳', '13800138025', 'caoyang@example.com', '网络安全', 26, 1, 5, '2023-01-25 20:00:00'),('邓超', '13800138026', 'dengchao@example.com', '计算机科学', 24, 1, 6, '2023-01-26 21:00:00'),('许晴', '13800138027', 'xuqing@example.com', '软件工程', 27, 0, 0, '2023-01-27 22:00:00'),('彭宇', '13800138028', 'pengyu@example.com', '数据科学', 29, 1, 1, '2023-01-28 23:00:00'),('蒋雯', '13800138029', 'jiangwen@example.com', '人工智能', 23, 0, 2, '2023-01-29 10:00:00'),('蔡明', '13800138030', 'caiming@example.com', '网络安全', 31, 1, 3, '2023-01-30 11:00:00);
案例要求:
-
name字段为姓名字段,该字段的值可能会重复,为该字段创建索引
-
phone手机号字段的值是非空的,且唯一的,为该字段创建唯一索引。
-
为profession、age、status创建联合索引
-
为email创建合适的索引来提升查询效率
代码展示:
show index from user;create index `idx_user_name` on `user`(`name`);create unique index `idx_user_phone` on `user`(`phone`);create index `id_user_pas` on `user`(`profession`,`age`,`status`);create index `idx_user_email` on `user`(`email`);drop index `idx_user_email` on `user`;
注意事项:
在使用联合索引时,放置字段的顺序是有讲究的,使用最频繁的字段放在左侧,根据使用频繁程度从重到轻,要遵循“最左前缀原则”
以上是对索引本身的了解以及如何建立索引,下一篇则是索引的性能分析,使用原则以及设计原则,希望对大家有所帮助!让我们一同进步!
相关文章:
MySQL--索引入门
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 Mysql在存储数据之外,数据库系统各种还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据…...
【网络原理】深入理解HTTPS协议
本篇博客给大家带来的是网络原理的知识点, 由于时间有限, 分三天来写, 本篇为线程第三篇,也是最后一篇. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动…...
利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb
题目信息: This new atom bomb early warning system is quite strange… 题目使用 elixir 语言 一开始,我们会访问 /page.html <!DOCTYPE html> <!-- 设定文档语言为英语 --> <html lang"en"> <head><!-- 设定字符编码为UTF-8 --><…...
机器人--STM32
STM32启动模式 1,从主闪存存储启动器启动(默认) 2,从系统存储启动器启动 下载程序时需要使用的启动方式。 3,从内置的SRAM启动...
LVGL -文本显示 英文、中文
1 文本 在 LVGL 中,文本控件(Label)是一种基本的 UI 组件,用于显示文本信息。文本控件可以用于各种场景,如显示状态信息、提示消息、标题等。在图形用户界面(GUI)开发中,文本是传达信息和指导用户的重要组成部分。为了有效地展示文本,以下是与文本相关的几个关键方面…...
Java面试资源获取
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 **1. GitHub开源项目****2. 技术博客与社区*…...
探索 Spring AI 的 ChatClient API:构建智能对话应用的利器
探索 Spring AI 的 ChatClient API:构建智能对话应用的利器 前言 在当今人工智能蓬勃发展的时代,智能对话系统成为了众多应用的核心组成部分。无论是客服机器人、智能助手还是聊天应用,都离不开高效、灵活的对话处理能力。Spring AI 作为 S…...
Java大师成长计划之第11天:Java Memory Model与Volatile关键字
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在多线程编程中,线程的执…...
java学习之数据结构:一、数组
主要是对数组所有的东西进行总结,整理 适合小白~ 目录 1.什么是数组 1.1数组定义 1.2数组创建 1)静态创建 2)动态创建 1.3数组遍历 1)for和while遍历 2)foreach遍历 2.数组越界问题及解决 2.1数组越界问题 2…...
Oracle OCP认证考试考点详解083系列04
题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 16. 第16题: 题目 解析及答案: 关于使用恢复管理器(RMAN)恢复表,以下哪三项是…...
MARM:推荐系统中的记忆增强突破
文章目录 1. 背景1.1 模型规模与推荐系统的挑战1.2 缓存技术在推荐系统中的潜力1.3 推荐系统中的数据与计算需求1.4 复杂度对比1.5 MARM模型的创新性 2. 方法2.1 流程2.1.1 序列生成器2.1.2 外部缓存查找2.1.3 多目标注意力机制2.1.4 发结果到缓存 **2.2 MARM与SIM**2.2.1 SIM的…...
INP指标
什么是INP(Interaction to Next Paint) 参考网站:webVital-INP文档 定义与核心目标 INP 是一项稳定的 Core Web Vitals 指标,通过统计用户访问期间所有符合条件的互动约定时间,评估网页对用户操作的总体响应能力。最…...
Flink 的状态机制
在实时流处理领域,状态管理是构建复杂业务逻辑的核心能力。Apache Flink 通过统一的状态抽象和高效的容错机制,为开发者提供了从毫秒级窗口聚合到 TB 级历史数据关联的全场景支持。本文将深入剖析 Flink 状态机制的底层原理,结合实际案例展示…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】1.1 数据库核心概念与PostgreSQL技术优势
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 深度解析PostgreSQL核心架构与技术优势:从数据库原理到实战场景1.1 数据库核心概念与PostgreSQL技术优势1.1.1 关系型数据库核心架构解析1.1.1.1 数据库系统的底…...
linux下,ollama会把模型文件保存在哪里?
文章目录 运行ollama,有两种形式,估计得分开讨论首先是使用自动启动的ollama:先跑个“小一点的大模型”但是现在模型文件存在哪儿呢?运行ollama,有两种形式,估计得分开讨论 我们用两种方式,来运行ollama。 首先是使用自动启动的ollama: ps -aux | grep ollama系统自…...
EMMC存储性能测试方法
记于 2022 年 9 月 15 日 EMMC存储性能测试方法 - Wesley’s Blog 参考Android-emmc性能测试 | 一叶知秋进行实践操作 dd 命令 页面缓存 为了测试 emmc 的真实读写性能,我们需要先把页面缓存给清理: echo 1 > /proc/sys/vm/drop_caches console:…...
19. LangChain安全与伦理:如何避免模型“幻觉“与数据泄露?
引言:当AI成为企业"数字员工"时的责任边界 2025年某金融机构因AI客服泄露用户信用卡信息被罚款2300万美元。本文将基于LangChain的安全架构与Deepseek-R1的合规实践,揭示如何构建既强大又安全的AI系统。 一、AI安全风险矩阵 1.1 2025年最新威…...
5月3日日记
上午睡到自然醒(其实六点多被我爸叫起来抢火车票,发现明天中午的软卧候补上了,挺好的)然后继续睡到快10点。 中午吃的什么来着,好像是西红柿炒鸡蛋和藜麦饭,有个鱼不是很想吃就没吃 中午打了两把吃鸡&…...
C++类_构造函数
在 C11 里,类的构造函数有多种类型,下面为你详细介绍各类构造函数并给出示例代码。 1. 默认构造函数 默认构造函数是没有参数的构造函数,要是没有为类定义任何构造函数,编译器会自动生成一个默认构造函数。 2. 带参数的构造函数…...
【React】Hooks useReducer 详解,让状态管理更可预测、更高效
1.背景 useReducer是React提供的一个高级Hook,没有它我们也可以正常开发,但是useReducer可以使我们的代码具有更好的可读性,可维护性。 useReducer 跟 useState 一样的都是帮我们管理组件的状态的,但是呢与useState不同的是 useReducer 是集…...
Runnable组件重试机制降低程序错误率
一、LangChain 重试机制深度解析 当构建生产级AI应用时,with_retry() 机制可有效提升系统容错性,典型应用场景包括: API调用频率限制时的自动恢复模型服务临时不可用的故障转移网络波动导致的瞬时异常处理 参数详解与配置策略 1. 参数配置…...
纹理过滤方式和纹理包裹方式
纹理过滤方式 纹理过滤方式有临近过滤(Nearest)和双线性插值过滤(Linear),什么时候用什么过滤方式其实看个人选择,区别就是临近过滤是当需要的像素大于图片像素时候,一些像素点需要复用与他相近…...
55.[前端开发-前端工程化]Day02-包管理工具npm等
包管理工具详解 npm、yarn、cnpm、npx、pnpm 1 npm包管理工具 代码共享方案 包管理工具npm 2 package配置文件 npm的配置文件 方式二 常见的配置文件 常见的属性 常见的属性 常见的属性 依赖的版本管理 常见属性 npm install 命令 项目安装 3 npm install原理 npm instal…...
Maven安装配置以及Idea中的配置教程
一、下载Maven 我使用的是3.9.9的版本: 下载地址:Download Apache Maven – Maven 二、安装 将下载好的Maven压缩包解压到一个路径不包含中文的文件夹: 三、配置环境变量 以win11系统为例: 1.鼠标右键此电脑->属性->…...
【JavaScript】性能优化:打造高效前端应用
文章目录 一、执行效率优化(关键路径优化)1.1 算法时间复杂度控制1.2 Web Workers多线程计算二、内存管理(避免内存泄漏)2.1 定时器清理2.2 DOM引用释放三、DOM操作优化(渲染性能)3.1 批量DOM更新3.2 读写分离策略四、网络传输优化(加载性能)4.1 代码分割(Dynamic Imp…...
【C语言练习】018. 定义和初始化结构体
018. 定义和初始化结构体 018. 定义和初始化结构体1. 定义结构体示例1:定义一个简单的结构体输出结果2. 初始化结构体示例2:在声明时初始化结构体输出结果示例3:使用指定初始化器初始化结构体(C99及以上标准支持)输出结果3. 结构体数组示例4:定义和初始化结构体数组输出结…...
Three.js支持模型格式区别、建议
在 Three.js 中,3D 模型的种类和格式非常多样,每种格式都有其适用场景和优缺点。以下是常见的 Three.js 支持的模型格式、它们的区别、使用建议及推荐。 在这里推荐免费的blender工具,免费、占用空间不大,而且好用,前端打开模型时使用不错,或者有自己想做的模型也可以用它…...
JavaScript基础-流程控制概念
在JavaScript编程中,掌握如何控制程序的执行流程是编写功能强大、逻辑清晰代码的关键。流程控制语句允许我们根据不同的条件执行不同的代码块,或者重复执行某些操作,从而实现复杂的功能逻辑。本文将详细介绍JavaScript中的几种主要流程控制结…...
PowerBI企业运营分析——多维度日期指标分析
PowerBI企业运营分析——多维度日期指标分析 欢迎来到Powerbi小课堂,在竞争激烈的市场环境中,企业运营分析平台成为提升竞争力的核心工具。 通过整合多源数据、实时监控关键指标,该平台能够精准分析业务表现,快速识别问题与机会…...
施磊老师rpc(三)
文章目录 mprpc框架项目动态库编译框架生成动态库框架初始化函数-文件读取1. 为什么要传入 argc, argv2. 读取参数逻辑3. 配置文件设计 init部分实现 mprpc配置文件加载(一)配置文件加载类成员变量主要方法**src/include/mprpcconfig.h** 配置文件**bin/test.conf** 实现配置文…...
k8s 探针
Kubernetes 中的探针(Probes)用于检测容器的健康状态或就绪状态,确保应用在运行时的可靠性。Kubernetes 提供三种探针类型,它们的核心区别在于用途和失败后的处理逻辑。以下是它们的详细说明和对比: 1. 启动探针&…...
MIT6.S081-lab8
MIT6.S081-lab8 1. Large files 从 lecture 我们可以知道,我们目前的单个文件的最大大小很小,这是因为我们能够索引的索引块范围很小,实际上,目前的索引只有直接索引和一级索引,而这个实验就是需要我们去实现二级索引…...
【RabbitMQ】 RabbitMQ快速上手
文章目录 一、RabbitMQ 核心概念1.1 Producer和Consumer2.2 Connection和Channel2.3 Virtual host2.4 Queue2.5 Exchange2.6 RabbitMQ工作流程 二、AMQP协议三 、web界面操作4.1 用户相关操作4.2 虚拟主机相关操作 四、RabbitMQ快速入门4.1 引入依赖4.2 编写生产者代码4.2.1 创…...
使用Rust + WebAssembly提升前端渲染性能:从原理到落地
一、问题背景:为什么选择WebAssembly? 最近在开发数据可视化大屏项目时,我们遇到了一个棘手的问题:前端需要实时渲染10万数据点的动态散点图,使用纯JavaScript Canvas方案在低端设备上帧率不足15FPS。经过性能分析&a…...
【quantity】9 长度单位模块(length.rs)
代码是用Rust语言定义的一组长度单位类型,利用了泛型和类型别名来创建带不同SI前缀的长度量。下面是详细解释: 基础结构: 使用了Quantity<V, P, Meter>作为基础类型,表示一个带有值类型V、前缀P和单位Meter的量。 Meter是…...
网络通信领域的基础或流行协议
一、TCP(传输控制协议) 1. 宏观介绍 TCP:全称“Transmission Control Protocol”——传输控制协议,是互联网最基础的传输协议之一。传输层协议,提供面向连接、可靠的字节流传输服务。它通过三次握手建立连接、四次挥手断开连接,确保数据有序、完整地传输作用:让两个设备…...
STM32——GPIO
1、GPIO简介 GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等 …...
AE模板 300个故障干扰损坏字幕条标题动画视频转场预设
这个AE模板提供了300个故障干扰损坏字幕条标题动画视频转场预设,让您的视频具有炫酷的故障效果。无论是预告片、宣传片还是其他类型的视频,这个模板都能带给您令人惊叹的故障运动标题效果。该模板无需任何外置插件或脚本,只需一键点击即可应用…...
2025-2026 XCPC
基本信息 本赛季由 jr-zlw \texttt{\color{#AA00AA}{jr-zlw}} jr-zlw, Skyzhou \texttt{\color{#03A89E} Skyzhou} Skyzhou 和 sunchaoyi \texttt{\color{#0000FF}sunchaoyi} sunchaoyi 组队,全靠大佬带飞~。 训练记录 2025.05.02 The 2023 Guangdong Provinci…...
list类的详细讲解
【本节目标】 1. list的介绍及使用 2. list的深度剖析及模拟实现 3. list与vector的对比 1. list的介绍及使用 1.1 list的介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 2. list 的底层是双向链表结构&a…...
中小企业MES系统数据库设计
版本:V1.0 日期:2025年5月2日 一、数据库架构概览 1.1 数据库选型 数据类型数据库类型技术选型用途时序数据(传感器读数)时序数据库TimescaleDB存储设备实时监控数据结构化业务数据关系型数据库PostgreSQL工单、质量、设备等核心…...
wfp CommandParameter 详细解说
WPF 中的 CommandParameter 是命令模型中的关键属性,用于向命令的执行逻辑传递动态参数。以下是其主要特性和应用场景的详细解析: 1. 基本概念与用法 数据传递机制 CommandParameter 通常与 Command 属性配合使用,允许在 XAML 中静态定义参数或在绑定中动态传递值。…...
正弦波、方波、三角波和锯齿波信号发生器——Multisim电路仿真
目录 Multisim使用教程说明链接 一、正弦波信号发生电路 1.1正弦波发生电路 电路组成 工作原理 振荡频率 1.2 正弦波发生电路仿真分析 工程文件链接 二、方波信号发生电路 2.1 方波发生电路可调频率 工作原理 详细过程 2.2 方波发生电路可调频率/可调占空比 调节占空比 方波产生…...
Java语言概述
Java语言概述 什么是程序? 程序是计算机执行某些操作或解决某个问题而编写的一系列有序指令单集合。 举例: 计算11,并把结果写在黑板上 计算11,并把结果显示在屏幕上(按编程语言规定的语句࿰…...
截图软件、画图软件、左右分屏插件、快捷键
截图软件 画图软件 画图时候按字母可以改变颜色:红色r,蓝色b,绿色g,粉色p,橙色o 左右分屏: 快捷键 1.打开文件或文件夹: CtrlP:快速打开文件。CtrlR:快速打开文件或文件夹。 2.文件操作: CtrlN&…...
Linux 信号
一、生活中的信号 1.1、生活中的信号从产生到结束过程 例: ①、外卖电话响了(信号产生)-> 我接了电话并告诉外卖员说先放到楼下的架子上(识别到这个信号,并记住,保存到我的脑海里面) ->…...
AI 生成内容的版权困境:法律、技术与伦理的三重挑战
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...
【愚公系列】《Manus极简入门》013-电影推荐专家:“银幕导航家”
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
MCP智能体意图识别与工具路由:让AI自主决策调用链路
目录 🚀 MCP智能体意图识别与工具路由:让AI自主决策调用链路 🌟 什么是意图识别与工具路由? 🛠️ 1. 设计意图识别模块 1.1 简易关键字规则版(基础版) 1.2 使用大模型辅助意图识别ÿ…...
【Redis】List类型
文章目录 List的特点介绍lpush,lpushx,rpush,rpushx命令lrange命令lpop和rpoplindex命令linsert命令llen命令lrem 命令ltrim命令lset命令阻塞版本的命令blpop和brpop 命令小结list的内部编码List的应用场景 List的特点介绍 列表相当于一个数…...