MySQL进阶_2.索引的设计原则

news2024/11/22 6:20:19

文章目录

  • 第一章、索引简介
    • 1.1 索引定义
    • 1.2 使用索引的目的
    • 1.3 B+树结构
  • 第二章 常见索引概念
    • 2.1 聚簇索引
    • 2.2 二级索引(辅助索引、非聚簇索引)
    • 2.3 比较
    • 2.4 联合索引
    • 2.5 总结
    • 2.6 索引的代价
  • 第三章 索引的分类和创建
    • 3.1 索引分类
    • 3.2 创建和删除索引
  • 第四章 索引的设计原则
    • 4.1 适合创建索引的情形和建议
    • 4.2 不适合创建索引的情况
    • 4.3 小结

第一章、索引简介

1.1 索引定义

官方定义:索引是帮助MySQL高效查询数据的数据结构
索引的本质:索引是数据结构,可以简单理解为排好序的快速查找数据结构,满足特定查找算法。这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。

1.2 使用索引的目的

为了减少磁盘I/O的次数,加快查询效率。

1.3 B+树结构

在这里插入图片描述

  • 上图中最下面一行的黄色框表示数据库表中的第一列(主键列c1),蓝色框表示第二列(c2),紫色框表示第三列(c3)。
  • 查询数据涉及磁盘IO,数据页的交互,使用B+树之后,完成一次查询所需要的数据页不超过4个。

第二章 常见索引概念

按照物理实现方式,索引可以分为2种:聚簇(聚集)和非聚簇(非聚集)索引。也称非聚集索引为二级索引或辅助索引。

2.1 聚簇索引

1.定义
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,索引即数据,数据即索引
聚簇表示数据行和相邻的键值存储在一起,索引的顺序就是数据在磁盘中实际的存储顺序。

在这里插入图片描述
上图是索引需要的顺序。我们使用主键id自增的方式向数据库添加数据时,一个数据页填满就放到下一个数据页,不会出现页分裂的问题,而且数据的存储顺序就是索引需要的顺序,所以索引即数据,数据即索引

2.特点

对照B+树的图:

  • 页内的记录是按照主键的大小顺序排成一个单向链表
  • 各个存放用户记录的页也是根据页中记录的主键大小顺序排成一个双向链表
  • 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表

3.限制

  • MySQL数据库目前只有InnoDb数据引擎支持聚簇索引。
  • 由于数据物理存储排序方式只能有一种,所以每个MySQL的表只能有一个聚簇索引。一般情况下就是该表的主键。
  • 如果没有定义主键,InnoDB会选择非空的唯一索引代替,如果没有这样的索引,InnoDB会隐式的定义一个主键来作为聚簇索引。
  • 为了充分利用聚簇序索引的聚簇的特性,InnoDB表的主键列尽量选择有序的顺序id

2.2 二级索引(辅助索引、非聚簇索引)

1.实例

聚簇索引只能在搜索条件是主键值时才能发挥作用,因为B+树中的数据都是按照主键进行排序的,如果我们想以别的列作为搜索条件,可以多建几棵B+树,不同的B+树中的数据采用不同的排列顺序,比如利用第二列的数据大小作为数据页、页中记录的排序规则,再建一棵B+树,如下:
在这里插入图片描述

  • 根据这个以第二列数据大小排序的B+树只能确定我们查找记录的主键列,如果我们想根据 第二列的值查到完整数据的话,仍然需要到聚簇索引中再查一遍,这个过程称为回表。也就是根据第二列的值查找完整数据需要用到两棵B+树。
  • 非聚簇索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个非聚簇索引

2.3 比较

在这里插入图片描述

  • 聚簇索引的叶子节点存储的就是我们的数据记录,非聚簇索引的叶子节点存储的是数据位置。非聚簇索引不会影响数据表的物理存储顺序。
  • 一个表只能有一个聚簇索引,因为只能有一种排序存储的方式,但可以有多个非聚簇索引,也就是多个索引目录提供数据检索。
  • 使用聚簇索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚簇索引低。

2.4 联合索引

我们也可以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让B+树按照 c2和c3列 的大小进行排序,这个包含两层含义:
1.先把各个记录和页按照c2列进行排序
2.在记录的c2列相同的情况下,采用c3列进行排序

联合索引本质上也是一个二级索引

2.5 总结

1.为什么不建议使用过长的字段作为主键?
因为所有二级索引都引用主键索引,过长的主键索引会导致二级索引变得过大。
2.InnoDB数据文件本身是一棵B+树,非单调的主键会造成插入新记录时,数据文件为了维持B+树的特性而频繁的分裂调整,十分低效。

2.6 索引的代价

1.空间上的代价
每建立一个索引都要为它建立一棵B+树,每一棵B+树的每一个节点都是一个数据页,一个页默认会占用16KB的存储空间,一棵很大的B+树由许多数据页组成,那就是很大的一片存储空间。I

2.时间上的代价
每次对表中的数据进行增、删、改操作时,都需要去修改各个B+树索引。B+树每层节点都是按照索引列的值从小到大的顺序排序而组成了双向链表。不论是叶子节点中的记录,还是内节点中的记录(也就是不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单向链表。而增、删、改操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行一些记录移位、页面分裂、页面回收等操作来维护好节点和记录的排序。如果我们建了许多索引,每个索引对应的B+树都要进行相关的维护操作,会给性能拖后腿。

第三章 索引的分类和创建

3.1 索引分类

分类方式说明
功能逻辑普通索引、唯一索引、主键索引、全文索引
物理实现方式聚簇索引和非聚簇索引
作用字段个数单列索引和联合索引

1.普通索引
在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。例如,在表student的字段name上建立一个普通索引,查询记录时就可以根据该索引进行查询。

2.唯一索引
使用UNIQUE参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值。在一张数据表里可以有多个唯一索引。例如,在表student的字段email中创建唯一性索引,那么字段email的值就必须是唯一的。通过唯一性索引,可以更快速地确定某条记录。

3.主键索引
主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,也就是NOT NUL + UNIQUE,一张表里最多只有一个主键索引。Why?这是由主键索引的物理实现方式决定的,因为数据存储在文件中只能按照一种顺序进行存储。

4.单列索引
在表中的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。一个表可以有多个单列索引

5.多列索引
多列索引是在表的多个字段组合上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中使用了这些字段中的第一个字段时才会被使用。例如,在表中的字段id、name和gender上建立一个多列索引idx_id_name_gender,只有在查询条件中使用了字段id时该索引才会被使用。使用组合索引时遵循最左前缀集合。

6.全文索引
全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用分词技术等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。全文索引非常适合大型数据集,对于小的数据集,它的用处比较小。使用参数FULLTEXT可以设置索引为全文索引。在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引只能创建在CHARVARCHARTEXT类型及其系列类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。例如,表student的字段information是TEXT类型,该字段包含了很多文字信息。在字段information上建立全文索引后,可以提高查询字段information的速度。随着大数据时代的到来,关系型数据库应对全文索引的需求已力不从心,逐渐被 solrElasticSearch等专门的搜索引擎所替代。

7.空间索引
使用参数SPATIAL可以设置索引为空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数据的效率。MySQL中的空间数据类型包括GEOMETRYPOINTLINESTRINGPOLYGON等。目前只有MylSAM存储引擎支持空间检索,而且索引的字段不能为空值。对于初学者来说,这类索引很少会用到。

3.2 创建和删除索引

MySQL支持多种方法在单个或多个列上创建索引:

  • 创建表的定义语句CREATE TABLE中指定索引列
  • 使用ALTER TABLE 语句在存在的表上创建索引
  • 使用CREATE INDEX语句在已存在的表上添加索引

1.创建表时创建索引

1.1 创建隐式索引:

CREATE TABLE dept(
  dept_id INT PRIMARY KEY AUTO_INCREMENT,
  dept_name VARCHAR(20)
);
// 主键索引、唯一索引、外键索引
CREATE TABLE emp(
  emp_id INT PRIMARY KEY AUTO_INCREMENT,
  emp_name VARCHAR(20) UNIQUE,
  dept_id INT,
  CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
);

在这里插入图片描述

1.2 创建显式索引

CREATE TABLE table_name(
  [col_name data_type]
  [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC |DESC]
  • UNIQUEFULLTEXTSPATIAL可选参数,分别表示唯一索引、全文索引和空间索引
  • INDEXKEY 为同义词,两者的作用相同,用来指定创建索引
  • index_name 指定索引的名称,为可选参数,如果不指定,那么MySQL默认col_name为索引名
  • col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择
  • length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度
  • ASCDESC 指定升序或者降序(在MySQL8.0,InnoDB引擎才有降序)的索引值存储

1.3 创建普通索引

CREATE TABLE book(
  book_id INT ,
  book_name VARCHAR(100),
  authors VARCHAR(100),
  info VARCHAR(100) ,
  comment VARCHAR(100),
  year_publication YEAR,
  INDEX(year_publication)
);

// 查看表中索引
SHOW INDEX FROM book;

1.4 创建唯一索引

CREATE TABLE test1(
  id INT NOT NULL,
  name varchar(30) NOT NULL,
  UNIQUE INDEX uk_idx_id(id)
);

声明有唯一索引的字段,在添加数据时,要保证唯一性

2.在已经存在的表上创建索引

2.1 使用ALTER TABLE语句创建索引

ALTER TABLE table_name 
ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name[length],...) [ASC | DESC]

2.2 使用CREATE INDEX创建索引

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name ON table_name (col_name[length],...) [ASC | DESC]

3.删除索引

3.1 使用ALTER TABLE删除索引

ALTER TABLE table_name DROP INDEX index_name;

3.2 使用DROP INDEX语句删除索引

DROP INDEX index_name ON table_name;

第四章 索引的设计原则

为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。索引设计不合理或者缺少索引都会对数据库和应用程序的性能造成障碍。高效的索引对于获得良好的性能非常重要。设计索引时,应该考虑相应准则。

4.1 适合创建索引的情形和建议

1.字段的数值有唯一性的限制

索引本身可以起到约束的作用,比如唯一索引、主键索引都是可以起到唯一性约束的,因此在我们的数据表中,如果某个字段是唯一性的,就可以直接创建唯一性索引,或者主键索引。这样可以更快速地通过该索引来确定某条记录。
例如,学生表中学号是具有唯一性的字段,为该字段建立唯一性索引可以很快确定某个学生的信息,如果使用姓名的话,可能存在同名现象,从而降低查询速度。

业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。(来源:Alibaba)
说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的

2.频繁作为 WHERE 查询条件的字段

某个字段在SELECT语句的 WHERE 条件中经常被使用到,那么就需要给这个字段创建索引了。尤其是在数据量大的情况下,创建普通索引就可以大幅提升数据查询的效率。

3.经常 GROUP BYORDER BY 的列

索引就是让数据按照某种顺序进行存储或检索,因此当我们使用 GROUP BY 对数据进行分组查询,或者使用 ORDER BY 对数据进行排序的时候,就需要对分组或者排序的字段进行索引 。如果待排序的列有多个,那么可以在这些列上建立组合索引 。

4.UPDATEDELETEWHERE 条件列

对数据按照某个条件进行查询后再进行 UPDATE 或 DELETE 的操作,如果对 WHERE 字段创建了索引,就能大幅提升效率。原理是因为我们需要先根据 WHERE 条件列检索出来这条记录,然后再对它进行更新或删除。如果进行更新的时候,更新的字段是非索引字段,提升的效率会更明显,这是因为非索引字段更新不需要对索引进行维护。

5.DISTINCT 字段需要创建索引

有时候我们需要对某个字段进行去重,使用 DISTINCT,那么对这个字段创建索引,也会提升查询效率。

6.多表 JOIN 连接操作时,创建索引注意事项

  • 连接表的数量尽量不要超过 3 张 ,因为每增加一张表就相当于增加了一次嵌套的循环,数量级增长会非常快,严重影响查询的效率。
  • WHERE 条件创建索引 ,因为 WHERE 才是对数据条件的过滤。如果在数据量非常大的情况下,没有 WHERE 条件过滤是非常可怕的。
  • 对用于连接的字段创建索引 ,并且该字段在多张表中的 类型必须一致 。比如 course_id (课程编号)在student_info 表和 course 表中都为 int(11) 类型,而不能一个为 int 另一个为 varchar 类型(如果一个为int一个为varchar,也会执行成功,MySQL会做类型转换,但是涉及函数操作,索引失效)。

7.使用列的类型小的创建索引

类型大小指的就是该类型表示数据范围的大小。

举个例子,如果我们想要对某个整数列建立索引的话,在表示的整数范围允许的情况下,尽量让索引列使用较小的类型,比如我们能使用INT就不要使用BIGINT,能使用MEDIUMINT就不要使用INT。这是因为:

  • 数据类型越小,在查询时进行的比较操作越快
  • 数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘I/0带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。

这个建议对于表的主键来说更加适用,因为不仅是聚簇索引中会存储主键值,其他所有的二级索引的节点处都会存储一份记录的主键值,如果主键使用更小的数据类型,也就意味着节省更多的存储空间和更高效的I/0。

8.使用字符串前缀创建索引

【 强制 】在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度。

9.区分度高(散列性高)的列适合作为索引

列的基数是指某一列中不重复数据的个数。

在记录行数一定的情况下,列的基数越大,该列中的值越分散;列的基数越小,该列中的值越集中。最好为基数大的列建立索引,为基数太小的列建立索引效果可能不太好。

可以使用公式 select count(distinct a) / count(*) from table 计算区分度,越接近1越好。一般超过33%就算是比较高效的索引了。

一般使用联合索引时将区分度高的列放在前面

10.使用最频繁的列放到联合索引的左侧

这样也可以较少的建立一些索引。同时,由于"最左前缀原则",可以增加联合索引的使用率。

11.在多个字段都要创建索引的情况下,联合索引优于单值索引

限制索引的数目
实际工作中,索引的数目不是越多越好。需要限制每张表上的索引数量,建议单张表索引数量不超过6个。原因:
1.每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。
2.索引会影响INSERTDELETEUPDATE等语句的性能,因为表中的数据更改的同时,索引也会进行调整和更新,会造成负担。
3.优化器在选择如何优化查询时,会根据统一信息,对每一个可以用到的索引来进行评估,以生成出一个最好的执行计划,如果同时有很多个索引都可以用于查询,会增加MySQL优化器生成执行计划时间,降低查询性能。

4.2 不适合创建索引的情况

1.在where中使用不到的字段,不要设置索引

WHERE 条件(包括GROUP BYORDER BY)里用不到的字段不需要创建索引,索引的价值是快速定位,如果起不到定位的字段通常是不需要创建索引的。

2.数据量小的表最好不要使用索引

如果表记录太少,比如少于1000个,那么是不需要创建索引的。表记录太少,是否创建索引对查询效率的影响并不大。甚至说,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。

3.有大量重复数据的列上不要建立索引

4.避免对经常更新的表创建过多的索引

5.不建议用无序的值作为索引

6.删除不再使用或者很少使用的索引

7.不要定义冗余或重复的索引

4.3 小结

选择索引的最终目的是为了使查询的速度变快,但也会降低插入更新的速度并占用磁盘空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集群-Nacos-2.2.3、Nginx-1.24.0集群配置

Nacos集群 高可用 Nginx 集群Nacos 集群(至少三个实例)高可用数据库集群(取代 Nacos 内嵌数据库) Nacos 集群搭建 集群使用版本: Nginx 1.24.0 Nacos 2.2.3 服务器IP服务器版本Nginx18.18.18.40CentOS-7.9MySQL18.18.…

2024免费的硬盘数据恢复软件有哪些?

在当今信息化的社会,数据成为了人们日常工作和生活的重要组成部分。不幸的是,数据丢失的问题也越来越普遍。硬盘数据恢复软件因此而产生,为那些不幸丢失数据的人们提供了救赎。在本文中,我们将介绍十大硬盘数据恢复软件。 一、Rec…

Mind Map:大语言模型中的知识图谱提示激发思维图10.1+10.2

知识图谱提示激发思维图 摘要介绍相关工作方法第一步:证据图挖掘第二步:证据图聚合第三步:LLM Mind Map推理 实验实验设置医学问答长对话问题使用KG的部分知识生成深入分析 总结 摘要 LLM通常在吸收新知识的能力、generation of hallucinati…

【STM32基础 CubeMX】ADC的基础使用

文章目录 前言一、ADC是什么二、使用CubeMX配置ADC三、代码分析3.1 cubemx生成代码分析3.2 ADC HAL库函数HAL_ADC_Start_IT开启adc中断函数获取ADC值 四、示例代码:获取光敏电阻的值总结 前言 在嵌入式系统开发中,STM32系列微控制器是广泛应用的一种硬件…

如何查看postgresql中的数据库大小?

你可以使用以下命令来查看PostgreSQL数据库的大小: SELECT pg_database.datname as "database_name", pg_size_pretty(pg_database_size(pg_database.datname)) AS size_in_mb FROM pg_database ORDER by size_in_mb DESC;这将返回一个表格&#xff0…

Mysql以key-val存储、正常存储的区别

场景 你作为一个服务端工程师,假设产品要求设计这么一个页面,页面上包含很多模块,每个模块都可以单独进行变更,有些模块是富文本。 实现方式有很多,我们来聊比较常用的两种,看看mysql的表如何设计。 第一…

【算法训练-贪心算法 一】买卖股票的最佳时机II

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【贪心算法】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

GROMACS Tutorial 5: Protein-Ligand Complex 中文实战教程

GROMACS Tutorial 5: Protein-Ligand Complex 中文实战教程 前言系统环境特别强调一、预处理阶段1.1 蛋白质配体分离以及除水操作1.2 选择力场识别JZ4配体1.2.1 使用在线力场解析1.2.2 使用官方推荐力场CHARMM36解析 1.3 蛋白的top文件准备1.4 配体的top文件准备1.5 使用CgenFF…

【Java每日一题】— —第十九题:用二维数组存放九九乘法表,并将其输出。(2023.10.03)

🕸️Hollow,各位小伙伴,今天我们要做的是第十九题。 🎯问题: 用二维数组存放九九乘法表,并将其输出。 测试结果如下: 🎯 答案: System.out.println("九九乘法表如…

Stable Diffusion云服务器部署完整版教程

Stable Diffusion云服务器部署完整版教程 2023年07月04日 22:30 3607浏览 18喜欢 22评论 <span class"bili-avatar-icon bili-avatar-right-icon "></span> </div>薯片_AI 粉丝&#xff1a; 1513 文章&#xff1a; 1 设置分组取消关注 已关注 …

CRMEB商城源码开源标准版v5.2.0+后端+前端uni-app开源包安装教程

CRMEB打通版是一款全开源支持商用的PHP多语言商城系统,系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步&#xff0c;可快速打包生成APP&#xff1b; 播播资源整合格安装测试了CRMEB商城系统功能非常全&#xff0c;官方的文档教程也非常多&#xff0c;包括如何打包…

linux 笔记 安装 anaconda

1 找到anaconda 安装包 Free Download | Anaconda 2 在linux环境中安装对应安装包 3 安装完毕后查看是否安装好 发现不行&#xff0c;需要配置环境变量 4 配置环境变量 vim /etc/profile使用这个&#xff0c;发现对应的文件是只读文件 sudo vim /etc/profile在最下面加一…

【数据结构与算法】- 数组

数组 1.1 数组的定义1.2 数组的创建1.3 数组在内存中的情况2.1 初始化数组2.2 插入元素2.3 删除元素2.4 读取元素2.5 遍历数组 1.1 数组的定义 数组中的是在内存中是连续存储的&#xff0c;内存是由一个个内存单元组成的&#xff0c;每一个内存单元都有自己的地址&#xff0c;…

【匠心打造】从0打造uniapp 可视化拖拽设计 c_o 第十篇

一、click one for uniapp置顶&#xff1a; 全部免费开源 (你商业用途也没关系&#xff0c;不过可以告诉我公司名或者项目名&#xff0c;放在官网上好看点。哈哈-_-) 二、写在之前 距离上一篇更新已经大约4个月了&#xff0c;公司的事情&#xff0c;自己的一些琐事一直没时间…

蓝队分析研判工具箱V0.81,支持14种哥斯拉流量解密|溯源辅助|佛法搜索|shiro、log4j2解密|各种java反编译...

Part1 前言 大家好&#xff0c;我是ABC_123。“蓝队分析研判工具箱”就是把我平时写的蓝队小工具集合起来形成的&#xff0c;重点解决蓝队分析工作中的一些痛点问题。此0.81版本支持哥斯拉webshell全部14种加密流量的解密&#xff0c;感谢"小黑"的帮助&#xff0c;添…

管道-有名管道

一、有名管道 有名管道与匿名管道的不同&#xff1a; 有名管道提供了一个路径名&#xff0c;并以FIFO的文件形式存在于文件系统中。与匿名管道不同&#xff0c;有名管道可以被不相关的进程使用&#xff0c;只要它们可以访问该路径&#xff0c;就能够通过有名管道进行通信。 FI…

7.wifi开发【智能家居:终】,实践总结:智能开关,智能采集温湿,智能灯。项目运行步骤与运行细节,技术归纳与提炼,项目扩展

一。项目运行步骤与运行细节 1.项目运行步骤&#xff08;一定有其他的运行方式&#xff0c;我这里只提供一种我现在使用的编译方式&#xff09; &#xff08;1&#xff09;项目运行使用软件与技术&#xff1a; 1.Virtual linux 使用这个虚拟机进行程序的编译 2.Makefile与shl…

构建捡垃圾机器人的 ROS 2 项目

一、说明 本系列是关于学习如何使用 ROS2、Docker 和 Github 设计、设置和维护机器人项目。 先决条件 — ROS2 软件包的基本知识、实现发布者、订阅者、操作并连接它们。 我们之前在 ROS2 中了解了不同的部分。但是&#xff0c;在我们转向实际的基于硬件的项目之前&#xff0c;…

【C++】C++11——C++11介绍、初始化列表、声明、auto、decltype、nullptr、范围for循环

文章目录 C111.C11介绍2.初始化列表2.1&#xff5b;&#xff5d;初始化2.2 std::initializer_list 3.声明3.1auto3.2decltype3.3nullptr 4.范围for循环 C11 1.C11介绍 C11是C编程语言的一个版本&#xff0c;于2011年发布。C11引入了很多新特性&#xff0c;比如&#xff1a;类型…

多线程 - 单例模式

单例模式 ~~ 单例模式是常见的设计模式之一 什么是设计模式 你知道象棋,五子棋,围棋吗?如果,你想下好围棋,你就不得不了解一个东西,”棋谱”,设计模式好比围棋中的 “棋谱”. 在棋谱里面,大佬们,把一些常见的对局场景,都给推演出来了,照着棋谱来下棋,基本上棋力就不会差到哪…