【面试题】MySQL 索引(第二篇)
1.索引
索引是数据库中的一个核心概念,它对于提高数据库查询效率至关重要。以下是索引的详细概念解析:
一、索引的定义
- 基本定义:索引是一个排序的列表,其中存储着索引的值和包含这些值的数据所在行的物理地址(或逻辑指针)。这类似于书籍的目录,通过目录可以快速定位到书中的具体内容。
- 物理结构:索引是一个单独的、物理的数据库结构,它是表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
二、索引的作用
- 加快查询速度:通过索引,数据库可以快速定位到数据的物理位置,避免了全表扫描,从而大大提高了查询效率。
- 保证数据的唯一性:通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
- 加速表连接:在进行表连接操作时,索引可以显著减少连接所需的时间,特别是在实现数据的参考完整性方面特别有意义。
- 优化排序和分组:在使用ORDER BY和GROUP BY子句进行数据检索时,索引可以显著减少查询中分组和排序的时间。
- 使用优化隐藏器:索引可以在查询的过程中使用优化隐藏器,提高系统的整体性能。
三、索引的分类
根据索引的不同特性和用途,可以将索引分为多种类型,包括但不限于以下几种:
- 普通索引:最基本的索引类型,没有唯一性之类的限制。它允许表中任何两行具有相同的索引值。
- 唯一索引:与普通索引类似,但唯一索引列的每个值都必须是唯一的。唯一索引允许有空值,但如果是用组合索引创建,则列值的组合必须唯一。
- 主键索引:一种特殊的唯一索引,它要求表中的每一行都必须有一个唯一的主键值。主键索引不允许有空值,并且一个表只能有一个主键索引。
- 聚集索引(聚簇索引):在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。
四、索引的创建和管理
索引可以在创建表时指定,也可以在表创建后通过ALTER TABLE语句添加。此外,还可以使用CREATE INDEX语句直接创建索引。在索引的管理方面,可以通过DROP INDEX语句删除不再需要的索引,以优化数据库的性能和存储空间。
五、索引的注意事项
- 索引虽然可以提高查询效率,但也会占用额外的存储空间,并可能降低更新表的速度(如插入、删除和更新操作),因为索引也需要随之更新。
- 在选择索引列时,应优先考虑那些在查询条件中经常出现的列、在连接操作中经常作为连接条件的列、以及经常出现在ORDER BY和GROUP BY子句中的列。
- 避免在索引列上使用函数或进行类型转换等操作,因为这可能会使索引失效。
综上所述,索引是数据库中的一个重要概念,它通过提供数据的快速访问路径来优化查询性能。然而,在使用索引时也需要权衡其带来的好处和潜在的成本。
2. MySQL中如何创建索引?
在MySQL中,可以使用CREATE INDEX语句来创建索引。例如,要为表的某个列创建索引,可以使用如下命令:
sql复制代码 CREATE INDEX index_name ON table_name(column_name);
索引可以显著提高查询性能,但也会占用额外的磁盘空间,并可能影响插入、删除和更新操作的性能。
3.常见的索引有哪些
常见的索引类型可以从不同的角度进行分类,以下是几种常见的索引类型:
一、从索引存储结构划分
-
B-树索引(BTREE索引):
-
又称B+树索引,是目前数据库系统中最为常用的索引类型。
-
它采用B+树数据结构来存储数据,能够支持等值查询、范围查询和前缀查询,并且可以对查询结果进行排序。
-
叶子节点包含了表中的数据,并且叶子节点之间通过指针相连,从而提高了区间访问的性能。
-
-
哈希索引(HASH索引):
-
通过哈希算法将索引键转换为哈希值,并存储在哈希表中。
-
检索时,通过计算查询条件的哈希值来快速定位到数据。
-
哈希索引适用于等值查询,但不支持范围查询和排序。
-
在MySQL中,只有MEMORY和HEAP存储引擎支持哈希索引。
-
-
全文索引(FULLTEXT索引):
-
主要用于在大量文本数据中搜索关键字。
-
它支持对文本内容进行分词处理,并存储每个词的位置信息,从而能够快速找到包含关键字的文本。
-
在MySQL中,全文索引可以在CHAR、VARCHAR或TEXT类型的列上创建,但需要注意的是,不同版本的MySQL支持的存储引擎可能有所不同。
-
-
空间索引(Spatial索引):
-
用于对空间数据类型(如GEOMETRY)的字段进行索引。
-
它主要用于地理空间数据的查询和检索。
-
在MySQL中,空间索引可以使用R-Tree等数据结构来实现。
-
二、从应用层次划分
-
普通索引:
-
最基本的索引类型,允许在定义索引的列中插入重复值和空值。
-
主要目的是加快系统对数据的访问速度。
-
-
唯一索引:
-
与普通索引类似,但索引列的值必须唯一。
-
允许有空值,但如果是组合索引,则列值的组合必须唯一。
-
-
主键索引:
-
是一种特殊的唯一索引,不允许值重复或为空。
-
每个表只能有一个主键索引。
-
-
复合索引(组合索引):
-
将表中的多个列共同组成一个索引。
-
在查询时,只有当查询条件中包含了索引中的第一个列时,索引才会被使用。
-
三、其他索引类型
-
聚簇索引(Clustered Index):
-
在InnoDB存储引擎中,聚簇索引是表中数据的物理存储方式。
-
聚簇索引的叶子节点包含了表中的实际数据行,因此找到聚簇索引也就找到了数据本身。
-
一个表只能有一个聚簇索引,且聚簇索引默认是主键索引。
-
-
非聚簇索引(Non-Clustered Index):
-
与聚簇索引相对,非聚簇索引的叶子节点不直接包含表中的数据,而是包含了一个指向表中数据行的指针或键。
-
在访问非聚簇索引时,通常需要回表查询来获取实际的数据。
-
-
自适应哈希索引(Adaptive Hash Index, AHI):
-
是InnoDB存储引擎中的内存结构的组成部分。
-
InnoDB存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引,以提高查询速度。
-
需要注意的是,索引的类型和存储引擎有关,每种存储引擎所支持的索引类型不一定完全相同。因此,在设计数据库和索引时,需要根据具体的应用场景和存储引擎来选择合适的索引类型。
4.索引的底层数据结构
索引的底层数据结构是数据库系统中一个至关重要的概念,它直接关系到数据库的查询效率和性能。常见的索引底层数据结构包括二叉树、红黑树、Hash表、B树和B+树等。以下是对这些数据结构的详细解析:
1. 二叉树
-
定义:每个节点最多有两个子节点的树结构,分别为左子节点和右子节点。
-
特点:二叉树的增删查操作复杂度和树的高度成正比,其遍历查找的时间复杂度为O(n)。在极端情况下,二叉树可能会构建成为一个单向链表结构,查找时相当于全表扫描,因此不适合作为索引的底层数据结构。
2. 红黑树
-
定义:一种近似平衡的二叉查找树,通过左旋/右旋操作保持二叉树的平衡,避免树的高度过高。
-
特点:虽然红黑树通过各种手段来尽量达到树的平衡,但其操作复杂度和树的高度仍然成正比,且不支持范围查询的快速查找,因此也不适合作为索引的底层数据结构。
3. Hash表
-
定义:通过散列函数将元素的键值映射为下标,并将数据存储在数组中对应下标的位置。
-
特点:
-
优点:在等值查询时效率很高,时间复杂度为O(1)。
-
缺点:不支持范围快速查找,且存在哈希冲突问题。因此,Hash表虽然在某些场景下(如K/V内存数据库)表现优异,但并不适合作为大多数数据库索引的底层数据结构。
-
4. B树
-
定义:一种多路平衡树,每个节点中存储着多个元素,且所有叶子节点都位于同一层。
-
特点:B树通过多路平衡解决了树的高度问题,但它在访问数据的查找效率上仍然有所欠缺,因为对于数据访问在非叶子节点和叶子节点都有的范围,它需要进行多次遍历。
5. B+树
-
定义:B+树是B树的变种,是数据库索引中最常用的数据结构。
-
特点:
-
非叶子节点不存储数据:只存储键值,这减少了非叶子节点的磁盘I/O操作。
-
叶子节点包含所有索引字段:并且叶子节点之间使用双向指针进行连接,形成了一个双向且有序的链表结构,这极大地提高了范围查询的效率。
-
支持等值查询和范围查询:由于B+树的这些特点,它既能保证等值查询的效率,又能支持范围查询的快速查找。
-
总结
在数据库索引的底层数据结构中,B+树因其良好的性能和广泛的应用场景而被广泛采用。它能够有效地减少磁盘I/O操作次数,提高查询效率,并支持等值查询和范围查询等多种查询方式。相比之下,其他数据结构如二叉树、红黑树和Hash表等在某些方面存在不足,因此不适合作为数据库索引的底层数据结构。
5.B树和B+树的区别
B树和B+树是数据库索引中常见的两种数据结构,它们之间在多个方面存在显著的区别。以下是B树和B+树的主要区别:
1. 节点存储数据的方式
-
B树:叶子结点和非叶子节点都会存储数据,指针和数据共同保存在同一节点中。这意味着在B树中,无论是内部节点还是叶子节点,都可能包含实际的数据记录。
-
B+树:数据均保存在叶子节点,非叶子节点只存储索引信息(即关键字和指向子节点的指针)。这种设计使得B+树的非叶子节点更加“轻量”,专注于索引功能。
2. 查找数据过程
-
B树:查找数据可能需要在各个节点上进行,包括内部节点和叶子节点。由于内部节点也存储数据,查找过程可能在不同层级的节点之间跳跃,导致查找效率不稳定。
-
B+树:查找数据只在叶子节点上进行。非叶子节点仅用于索引定位,引导查找过程从根节点逐层向下,直到叶子节点。这种“路径唯一”的查找方式使得B+树的查找效率更加稳定。
3. 空间利用率
-
B树:由于每个节点都存储数据,空间利用率相对较低。特别是在数据量较大的情况下,B树的节点可能很快被填满,导致树的高度增加,影响查询性能。
-
B+树:只有叶子节点存储数据,非叶子节点只存储索引信息。这种设计使得B+树能够更有效地利用空间,因为非叶子节点可以容纳更多的索引项,从而减少树的高度。
4. 结构稳定性
-
B树:插入和删除数据时需要频繁变更树的结构,包括节点的分裂和合并等操作。这些操作可能导致树的结构变得不稳定,影响查询性能。
-
B+树:插入和删除数据操作均放在叶子节点上进行,非叶子节点保持不变。这种设计维护了树结构的稳定性,使得B+树在数据变动时能够保持较好的查询性能。
5. 范围查找性能
-
B树:由于数据可能分散存储在多个节点中,范围查找需要在各个节点上逐个查找,效率较低。
-
B+树:所有数据记录都存储在叶子节点上,且叶子节点同时还维护了一条双向链表。这种设计使得B+树在进行范围查询时能够高效地遍历叶子节点链表,从而提高范围查询的效率。
6. 应用场景
-
B树:由于其结构特点,B树更适合于数据库的索引结构,特别是处理大量点查询的场景。
-
B+树:由于其良好的空间利用率和查询性能(特别是范围查询性能),B+树更适合用于文件系统等场景,以及处理大量范围查询和排序操作的数据库索引。
综上所述,B树和B+树在节点存储数据的方式、查找数据过程、空间利用率、结构稳定性和范围查找性能等方面存在显著的区别。这些区别使得它们在不同的应用场景中各有优势。
6.SQL优化
SQL优化是数据库管理和维护中的一项重要任务,旨在提高数据库查询和操作的效率,减少资源消耗。以下是一些SQL优化的关键方法和策略:
1. 索引优化
-
建立索引:在WHERE和ORDER BY子句中涉及的列上建立索引可以显著提高查询速度。确保索引覆盖了查询中的过滤和排序条件。
-
复合索引:对于多列查询,可以考虑建立复合索引。使用复合索引时,需遵守最左前缀原则,即查询条件中必须包含索引的最左边列。
-
避免过多索引:虽然索引可以提高查询速度,但过多的索引会占用大量磁盘空间,并降低更新表的速度(因为每次更新表时都需要更新索引)。因此,应根据实际查询需求合理设置索引。
2. 查询优化
-
避免SELECT *:尽量指定需要查询的字段,而不是使用SELECT *。这样可以减少数据传输量,提高查询效率。
-
优化WHERE子句:
-
避免在WHERE子句中对字段进行NULL值判断,因为这可能导致全表扫描。
-
尽量避免使用OR来连接条件,因为这也可能导致索引失效。
-
慎用IN和NOT IN操作符,因为它们可能导致全表扫描。对于连续的数值范围,可以使用BETWEEN。
-
避免在WHERE子句中对字段进行函数或表达式操作,因为这会使索引失效。
-
-
使用LIMIT:当只需要查询部分数据时,使用LIMIT子句可以减少数据传输量,提高查询效率。
3. 语句优化
-
使用EXISTS代替IN:在某些情况下,使用EXISTS代替IN可以提高查询效率。因为EXISTS子句在找到第一个匹配项时就会停止搜索。
-
优化JOIN操作:在JOIN操作中,尽量使用小表作为驱动表,并确保JOIN条件上有索引。
-
避免子查询:子查询可能会导致查询效率低下,尤其是当子查询返回大量数据时。可以考虑将子查询改写为JOIN操作或使用临时表。
4. 其他优化策略
-
使用表变量代替临时表:在可能的情况下,使用表变量代替临时表可以减少系统表资源的消耗。但请注意,表变量的索引非常有限(只有主键索引)。
-
避免频繁创建和删除临时表:频繁创建和删除临时表会消耗大量系统资源。如果需要使用临时表,请考虑在存储过程的最后显式删除它们。
-
优化存储过程和触发器:在存储过程和触发器的开始处设置SET NOCOUNT ON,在结束时设置SET NOCOUNT OFF,以减少网络传输量。
-
考虑使用全文检索:对于LIKE '%value%'这样的模糊查询,如果数据量很大,可能会导致查询效率低下。此时,可以考虑使用全文检索来提高查询效率。
5. 性能分析工具
-
使用EXPLAIN关键字:大多数数据库都提供了EXPLAIN关键字,用于分析SQL语句的执行计划。通过查看执行计划,可以了解查询是如何执行的,并找到性能瓶颈所在。
-
定期监控和分析:定期监控数据库的性能指标(如查询响应时间、CPU使用率、内存使用率等),并对查询日志进行分析,以发现潜在的性能问题。
综上所述,SQL优化是一个综合性的工作,需要从索引、查询、语句、其他策略以及性能分析工具等多个方面入手。通过不断的优化和调整,可以显著提高数据库的性能和稳定性。
相关文章:
【面试题】MySQL 索引(第二篇)
1.索引 索引是数据库中的一个核心概念,它对于提高数据库查询效率至关重要。以下是索引的详细概念解析: 一、索引的定义 基本定义:索引是一个排序的列表,其中存储着索引的值和包含这些值的数据所在行的物理地址(或逻…...
4. 小迪安全v2023笔记 javaEE应用
4. 小迪安全v2023笔记 javaEE应用 大体上跟随小迪安全的课程,本意是记录自己的学习历程,不能说是完全原创吧,大家可以关注一下小迪安全。 若有冒犯,麻烦私信移除。 默认有java基础。 文章目录 4. 小迪安全v2023笔记 javaEE应…...
anaconda修改安装的默认环境
📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️如遇文章付费,可先看…...
MySQL 9.0 正式发行Innovation创新版已支持向量
从 MySQL 8.1 开始,官方启用了新的版本模型:MySQL 创新版 (Innovation) 和长期支持版 (LTS)。 根据介绍,两者的质量都已达到可用于生产环境级别。区别在于: 如果希望尝试最新的功能和改进,并喜欢与最新技术保持同步&am…...
基于Java+SpringMvc+Vue技术的智慧校园系统设计与实现
博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…...
【蔬菜网元宇宙】—— 探索农业的未来之旅
在数字化时代的浪潮中,技术和创新不断塑造着我们的生活方式。现在,这种变革已经延伸到了农业领域。蔬菜网,一个专注于农产品供应链的领先平台,自豪地宣布我们正式迈入元宇宙的世界——一个全新的虚拟空间,旨在彻底改变…...
淘宝商品历史价格查询(免费)
当前资料来源于网络,禁止用于商用,仅限于学习。 淘宝联盟里面就可以看到历史价格 并且没有加密 淘宝商品历史价格查询可以通过以下步骤进行: 先下载后,登录app注册账户 打开淘宝网站或淘宝手机App。在搜索框中输入你想要查询的商…...
14-47 剑和诗人21 - 2024年如何打造AI创业公司
2024 年,随着人工智能继续快速发展并融入几乎所有行业,创建一家人工智能初创公司将带来巨大的机遇。然而,在吸引资金、招聘人才、开发专有技术以及将产品推向市场方面,人工智能初创公司也面临着相当大的挑战。 让我来…...
WPF界面设计-更改按钮样式 自定义字体图标
一、下载图标文件 iconfont-阿里巴巴矢量图标库 二、xaml界面代码编辑 文件结构  对应的图标代码 Fonts/#iconfont 对应文件位置 <Window.Resources><ControlTemplate TargetType"Button" x:Key"CloseButtonTemplate"…...
开源项目的机遇与挑战
随着全球经济和科技环境的快速变化,开源软件项目的蓬勃发展成为了开发者社区的热门话题。越来越多的开发者和企业选择参与开源项目,以推动技术创新和实现协作共赢。本文将从开源项目的发展趋势、参与开源的经验分享,以及开源项目的挑战三个方…...
Linux实现CPU物理隔离
文章目录 背景使用 taskset 命令使用 cgroups案例 背景 在 Linux 上实现 CPU 的物理隔离(也称为 CPU 隔离或 CPU pinning),可以通过将特定的任务或进程绑定到特定的 CPU 核心来实现。这可以提高系统性能,尤其是在需要实时响应的应…...
springer latex模板参考文献不显示
原因 his is BibTeX, Version 0.99d (TeX Live 2024) The top-level auxiliary file: sn-article.aux I couldn’t open style file sn-mathphys-num.bst —line 2 of file sn-article.aux : \bibstyle{sn-mathphys-num : } I’m skipping whatever remains of this command I…...
使用Vue3、Pinia和Vite5打造高度还原的抖音仿制项目
douyin-vue 是一个模仿 抖音|TikTok 的移动端短视频项目。Vue 在移动端的"最佳实践",媲美原生 App 丝滑流畅的使用体验。使用了最新的 Vue 技术栈,基于 Vue3、Vite5 、Pinia实现。数据保存在项目本地,通过 axios-mock-adapter 库拦…...
stm32基本定时器
Driver_TIM6.c 需要注意立即进入中断问题,原因是预分频寄存器并没有更新预分频系数。 #include "Driver_TIM6.h" #include "Delay.h" /*** description: 给定时器6进行初始化* return {*}*/ void Driver_TIM6_Init(void) {/* 1. 给定时器6开启…...
网络安全基础-1
棱角社区:[~]#棱角 ::Edge.Forum* 专业名词 操作系统 文件下载 linux:下载命令 1. wget命令 wget是一个非常强大的命令行下载工具,支持HTTP、HTTPS、FTP等多种协议,并具备断点续传、递归下载等功能。 基本用法: 下载文件到…...
SSH远程访问及控制
目录 一、SSH远程管理 1、SSH定义 2、SSH客户端和服务端 3、SSH工作类型 3.1、对称加密 3.2、非对称加密 4、SSH工作原理 公钥传输原理 4.1、基本概念 4.2、工作过程 5、OpenSSH服务器 二、SSH远程登录方式 1、SSH直接远程登录 2、SSH指定端口登录 3、黑白名单 …...
Qt 绘图详解
文章目录 头文件和构造函数启用反锯齿功能绘制矩形绘制圆角矩形绘制椭圆绘制圆弧绘制弦绘制凸多边形绘制图片绘制直线绘制多条直线绘制多点连接的线绘制路径绘制扇形绘制点绘制文本擦除矩形区域填充矩形填充路径 头文件和构造函数 #include "mainwindow.h" #include…...
Python 爬虫与 Java 爬虫:相似之处、不同之处和选项
在信息时代,网络上可用的数据量巨大且不断增长。为了从这些数据中提取有用的信息,爬虫已成为一种重要的技术。Python 和 Java 都是流行的编程语言,都具有强大的爬虫功能。本文将深入探讨 Python 爬虫和 Java 爬虫之间的差异,以帮助…...
视频监控汇聚平台LntonCVS视频监控系统解决智慧产业园的安全应用方案
近年来,随着全国各地数字化转型和相关政策的出台,数字化和智慧化在各行业迅速发展,尤其是作为产业集群重要组成部分的产业园区。然而,园区智慧化进程加快的同时,数字化转型面临着诸如视频监控数据分散、联通不畅、碎片…...
MAVLink代码生成-C#
一. 准备Windows下安装环境 Python 3.3 – 官网链接下载Python future模块 –pip3 install future TkInter (GUI 工具). – python for Windows自带,无需下载环境变量PYTHONPATH必须包含mavlink存储库的目录路径。 –set PYTHONPATH你的mavlink源码路径 源码下载在…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
