【免费分享】mysql笔记,涵盖查询、缓存、存储过程、索引,优化。

概括

本篇笔记涵盖基础查询、视图、存储过程、函数、索引、优化、分库分表。适合在学完mysql后进行时常观看。下面展示部分内容。如果需要可以在文章底部的链接进行下载查看。

简介

数据库

数据库:DataBase,简称 DB,存储和管理数据的仓库

数据库的优势:

  • 可以持久化存储数据
  • 方便存储和管理数据
  • 使用了统一的方式操作数据库 SQL

数据库、数据表、数据的关系介绍:

  • 数据库

    • 用于存储和管理数据的仓库
    • 一个库中可以包含多个数据表
  • 数据表

    • 数据库最重要的组成部分之一
    • 由纵向的列和横向的行组成(类似 excel 表格)
    • 可以指定列名、数据类型、约束等
    • 一个表中可以存储多条数据
  • 数据:想要永久化存储的数据

参考视频:https://www.bilibili.com/video/BV1zJ411M7TB

参考专栏:https://time.geekbang.org/column/intro/139

参考书籍:https://book.douban.com/subject/35231266/


MySQL

MySQL 数据库是一个最流行的关系型数据库管理系统之一,关系型数据库是将数据保存在不同的数据表中,而且表与表之间可以有关联关系,提高了灵活性

缺点:数据存储在磁盘中,导致读写性能差,而且数据关系复杂,扩展性差

MySQL 所使用的 SQL 语句是用于访问数据库最常用的标准化语言

MySQL 配置:

  • MySQL 安装:https://www.jianshu.com/p/ba48f1e386f0

  • MySQL 配置:

    • 修改 MySQL 默认字符集:安装 MySQL 之后第一件事就是修改字符集编码

      vim /etc/mysql/my.cnf添加如下内容:
      [mysqld]
      character-set-server=utf8
      collation-server=utf8_general_ci[client]
      default-character-set=utf8
      
    • 启动 MySQL 服务:

      systemctl start/restart mysql
      
    • 登录 MySQL:

      mysql -u root -p  敲回车,输入密码
      初始密码查看:cat /var/log/mysqld.log
      在root@localhost:   后面的就是初始密码
      
    • 查看默认字符集命令:

      SHOW VARIABLES LIKE 'char%';
      
    • 修改MySQL登录密码:

      set global validate_password_policy=0;
      set global validate_password_length=1;set password=password('密码');
      
    • 授予远程连接权限(MySQL 内输入):

      -- 授权
      grant all privileges on *.* to 'root' @'%' identified by '密码';
      -- 刷新
      flush privileges;
      
  • 修改 MySQL 绑定 IP:

    cd /etc/mysql/mysql.conf.d
    sudo chmod 666 mysqld.cnf 
    vim mysqld.cnf 
    # bind-address = 127.0.0.1注释该行
    
  • 关闭 Linux 防火墙

    systemctl stop firewalld.service
    # 放行3306端口
    

体系架构

整体架构

体系结构详解:

  • 第一层:网络连接层
    • 一些客户端和链接服务,包含本地 Socket 通信和大多数基于客户端/服务端工具实现的 TCP/IP 通信,主要完成一些类似于连接处理、授权认证、及相关的安全方案
    • 在该层上引入了连接池 Connection Pool 的概念,管理缓冲用户连接,线程处理等需要缓存的需求
    • 在该层上实现基于 SSL 的安全链接,服务器也会为安全接入的每个客户端验证它所具有的操作权限
  • 第二层:核心服务层
    • 查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,所有的内置函数(日期、数学、加密函数等)
      • Management Serveices & Utilities:系统管理和控制工具,备份、安全、复制、集群等
      • SQL Interface:接受用户的 SQL 命令,并且返回用户需要查询的结果
      • Parser:SQL 语句分析器
      • Optimizer:查询优化器
      • Caches & Buffers:查询缓存,服务器会查询内部的缓存,如果缓存空间足够大,可以在大量读操作的环境中提升系统性能
    • 所有跨存储引擎的功能在这一层实现,如存储过程、触发器、视图等
    • 在该层服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的查询顺序,是否利用索引等, 最后生成相应的执行操作
    • MySQL 中服务器层不管理事务,事务是由存储引擎实现的
  • 第三层:存储引擎层
    • Pluggable Storage Engines:存储引擎接口,MySQL 区别于其他数据库的重要特点就是其存储引擎的架构模式是插件式的(存储引擎是基于表的,而不是数据库)
    • 存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 和存储引擎进行通信
    • 不同的存储引擎具有不同的功能,共用一个 Server 层,可以根据开发的需要,来选取合适的存储引擎
  • 第四层:系统文件层
    • 数据存储层,主要是将数据存储在文件系统之上,并完成与存储引擎的交互
    • File System:文件系统,保存配置文件、数据文件、日志文件、错误文件、二进制文件等


建立连接

连接器

池化技术:对于访问数据库来说,建立连接的代价是比较昂贵的,因为每个连接对应一个用来交互的线程,频繁的创建关闭连接比较耗费资源,有必要建立数据库连接池,以提高访问的性能

连接建立 TCP 以后需要做权限验证,验证成功后可以进行执行 SQL。如果这时管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限,只有再新建的连接才会使用新的权限设置

MySQL 服务器可以同时和多个客户端进行交互,所以要保证每个连接会话的隔离性(事务机制部分详解)

整体的执行流程:

*** #### 权限信息

grant 语句会同时修改数据表和内存,判断权限的时候使用的是内存数据

flush privileges 语句本身会用数据表(磁盘)的数据重建一份内存权限数据,所以在权限数据可能存在不一致的情况下使用,这种不一致往往是由于直接用 DML 语句操作系统权限表导致的,所以尽量不要使用这类语句


连接状态

客户端如果长时间没有操作,连接器就会自动断开,时间是由参数 wait_timeout 控制的,默认值是 8 小时。如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒:Lost connection to MySQL server during query

数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接;短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个

为了减少连接的创建,推荐使用长连接,但是过多的长连接会造成 OOM,解决方案:

  • 定期断开长连接,使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连

    KILL CONNECTION id
    
  • MySQL 5.7 版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态

SHOW PROCESSLIST:查看当前 MySQL 在进行的线程,可以实时地查看 SQL 的执行情况,其中的 Command 列显示为 Sleep 的这一行,就表示现在系统里面有一个空闲连接

参数含义
ID用户登录 mysql 时系统分配的 connection_id,可以使用函数 connection_id() 查看
User显示当前用户,如果不是 root,这个命令就只显示用户权限范围的 sql 语句
Host显示这个语句是从哪个 ip 的哪个端口上发的,可以用来跟踪出现问题语句的用户
db显示这个进程目前连接的是哪个数据库
Command显示当前连接的执行的命令,一般取值为休眠 Sleep、查询 Query、连接 Connect 等
Time显示这个状态持续的时间,单位是秒
State显示使用当前连接的 sql 语句的状态,以查询为例,需要经过 copying to tmp table、sorting result、sending data等状态才可以完成
Info显示执行的 sql 语句,是判断问题语句的一个重要依据

Sending data 状态表示 MySQL 线程开始访问数据行并把结果返回给客户端,而不仅仅只是返回给客户端,是处于执行器过程中的任意阶段。由于在 Sending data 状态下,MySQL 线程需要做大量磁盘读取操作,所以是整个查询中耗时最长的状态。


执行流程

查询缓存
工作流程

当执行完全相同的 SQL 语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,之前的缓存会失效,修改比较频繁的表不适合做查询缓存

查询过程:

  1. 客户端发送一条查询给服务器
  2. 服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果(一般是 K-V 键值对),否则进入下一阶段
  3. 分析器进行 SQL 分析,再由优化器生成对应的执行计划
  4. MySQL 根据优化器生成的执行计划,调用存储引擎的 API 来执行查询
  5. 将结果返回给客户端

大多数情况下不建议使用查询缓存,因为查询缓存往往弊大于利

  • 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能费力地把结果存起来,还没使用就被一个更新全清空了,对于更新压力大的数据库来说,查询缓存的命中率会非常低
  • 除非业务就是有一张静态表,很长时间才会更新一次,比如一个系统配置表,那这张表上的查询才适合使用查询缓存

缓存配置
  1. 查看当前的 MySQL 数据库是否支持查询缓存:

    SHOW VARIABLES LIKE 'have_query_cache';	-- YES
    
  2. 查看当前 MySQL 是否开启了查询缓存:

    SHOW VARIABLES LIKE 'query_cache_type';	-- OFF
    

    参数说明:

    • OFF 或 0:查询缓存功能关闭

    • ON 或 1:查询缓存功能打开,查询结果符合缓存条件即会缓存,否则不予缓存;可以显式指定 SQL_NO_CACHE 不予缓存

    • DEMAND 或 2:查询缓存功能按需进行,显式指定 SQL_CACHE 的 SELECT 语句才缓存,其它不予缓存

      SELECT SQL_CACHE id, name FROM customer; -- SQL_CACHE:查询结果可缓存
      SELECT SQL_NO_CACHE id, name FROM customer;-- SQL_NO_CACHE:不使用查询缓存
      
  3. 查看查询缓存的占用大小:

    SHOW VARIABLES LIKE 'query_cache_size';-- 单位是字节 1048576 / 1024 = 1024 = 1KB
    
  4. 查看查询缓存的状态变量:

    SHOW STATUS LIKE 'Qcache%';
    
    参数含义
    Qcache_free_blocks查询缓存中的可用内存块数
    Qcache_free_memory查询缓存的可用内存量
    Qcache_hits查询缓存命中数
    Qcache_inserts添加到查询缓存的查询数
    Qcache_lowmen_prunes由于内存不足而从查询缓存中删除的查询数
    Qcache_not_cached非缓存查询的数量(由于 query_cache_type 设置而无法缓存或未缓存)
    Qcache_queries_in_cache查询缓存中注册的查询数
    Qcache_total_blocks查询缓存中的块总数
  5. 配置 my.cnf:

    sudo chmod 666 /etc/mysql/my.cnf
    vim my.cnf
    # mysqld中配置缓存
    query_cache_type=1
    

    重启服务既可生效,执行 SQL 语句进行验证 ,执行一条比较耗时的 SQL 语句,然后再多执行几次,查看后面几次的执行时间;获取通过查看查询缓存的缓存命中数,来判定是否走查询缓存


缓存失效

查询缓存失效的情况:

  • SQL 语句不一致,要想命中查询缓存,查询的 SQL 语句必须一致,因为缓存中 key 是查询的语句,value 是查询结构

    select count(*) from tb_item;
    Select count(*) from tb_item;	-- 不走缓存,首字母不一致
    
  • 当查询语句中有一些不确定查询时,则不会缓存,比如:now()、current_date()、curdate()、curtime()、rand()、uuid()、user()、database()

    SELECT * FROM tb_item WHERE updatetime < NOW() LIMIT 1;
    SELECT USER();
    SELECT DATABASE();
    
  • 不使用任何表查询语句:

    SELECT 'A';
    
  • 查询 mysql、information_schema、performance_schema 等系统表时,不走查询缓存:

    SELECT * FROM information_schema.engines;
    
  • 跨存储引擎的存储过程、触发器或存储函数的主体内执行的查询,缓存失效

  • 如果表更改,则使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除,包括使用 MERGE 映射到已更改表的表的查询,比如:INSERT、UPDATE、DELETE、ALTER TABLE、DROP TABLE、DROP DATABASE


分析器

没有命中查询缓存,就开始了 SQL 的真正执行,分析器会对 SQL 语句做解析

SELECT * FROM t WHERE id = 1;

解析器:处理语法和解析查询,生成一课对应的解析树

  • 先做词法分析,输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么代表什么。从输入的 select 这个关键字识别出来这是一个查询语句;把字符串 t 识别成 表名 t,把字符串 id 识别成列 id
  • 然后做语法分析,根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。如果你的语句不对,就会收到 You have an error in your SQL syntax 的错误提醒

预处理器:进一步检查解析树的合法性,比如数据表和数据列是否存在、别名是否有歧义等


优化器
成本分析

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序

  • 根据搜索条件找出所有可能的使用的索引
  • 成本分析,执行成本由 I/O 成本和 CPU 成本组成,计算全表扫描和使用不同索引执行 SQL 的代价
  • 找到一个最优的执行方案,用最小的代价去执行语句

在数据库里面,扫描行数是影响执行代价的因素之一,扫描的行数越少意味着访问磁盘的次数越少,消耗的 CPU 资源越少,优化器还会结合是否使用临时表、是否排序等因素进行综合判断


统计数据

MySQL 中保存着两种统计数据:

  • innodb_table_stats 存储了表的统计数据,每一条记录对应着一个表的统计数据
  • innodb_index_stats 存储了索引的统计数据,每一条记录对应着一个索引的一个统计项的数据

MySQL 在真正执行语句之前,并不能精确地知道满足条件的记录有多少条,只能根据统计信息来估算记录,统计信息就是索引的区分度,一个索引上不同的值的个数(比如性别只能是男女,就是 2 ),称之为基数(cardinality),基数越大说明区分度越好

通过采样统计来获取基数,InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数

在 MySQL 中,有两种存储统计数据的方式,可以通过设置参数 innodb_stats_persistent 的值来选择:

  • ON:表示统计信息会持久化存储(默认),采样页数 N 默认为 20,可以通过 innodb_stats_persistent_sample_pages 指定,页数越多统计的数据越准确,但消耗的资源更大
  • OFF:表示统计信息只存储在内存,采样页数 N 默认为 8,也可以通过系统变量设置(不推荐,每次重新计算浪费资源)

数据表是会持续更新的,两种统计信息的更新方式:

  • 设置 innodb_stats_auto_recalc 为 1,当发生变动的记录数量超过表大小的 10% 时,自动触发重新计算,不过是异步进行
  • 调用 ANALYZE TABLE t 手动更新统计信息,只对信息做重新统计(不是重建表),没有修改数据,这个过程中加了 MDL 读锁并且是同步进行,所以会暂时阻塞系统

EXPLAIN 执行计划在优化器阶段生成,如果 explain 的结果预估的 rows 值跟实际情况差距比较大,可以执行 analyze 命令重新修正信息


错选索引

采样统计本身是估算数据,或者 SQL 语句中的字段选择有问题时,可能导致 MySQL 没有选择正确的执行索引

解决方法:

  • 采用 force index 强行选择一个索引

    SELECT * FROM user FORCE INDEX(name) WHERE NAME='seazean';
    
  • 可以考虑修改 SQL 语句,引导 MySQL 使用期望的索引

  • 新建一个更合适的索引,来提供给优化器做选择,或删掉误用的索引


执行器

开始执行的时候,要先判断一下当前连接对表有没有执行查询的权限,如果没有就会返回没有权限的错误,在工程实现上,如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。如果有权限,就打开表继续执行,执行器就会根据表的引擎定义,去使用这个引擎提供的接口


引擎层

Server 层和存储引擎层的交互是以记录为单位的,存储引擎会将单条记录返回给 Server 层做进一步处理,并不是直接返回所有的记录

工作流程:

  • 首先根据二级索引选择扫描范围,获取第一条符合二级索引条件的记录,进行回表查询,将聚簇索引的记录返回 Server 层,由 Server 判断记录是否符合要求
  • 然后在二级索引上继续扫描下一个符合条件的记录

推荐阅读:https://mp.weixin.qq.com/s/YZ-LckObephrP1f15mzHpA


终止流程

终止语句

终止线程中正在执行的语句:

KILL QUERY thread_id

KILL 不是马上终止的意思,而是告诉执行线程这条语句已经不需要继续执行,可以开始执行停止的逻辑(类似于打断)。因为对表做增删改查操作,会在表上加 MDL 读锁,如果线程被 KILL 时就直接终止,那这个 MDL 读锁就没机会被释放了

命令 KILL QUERYthread_id_A 的执行流程:

  • 把 session A 的运行状态改成 THD::KILL_QUERY(将变量 killed 赋值为 THD::KILL_QUERY)
  • 给 session A 的执行线程发一个信号,让 session A 来处理这个 THD::KILL_QUERY 状态

会话处于等待状态(锁阻塞),必须满足是一个可以被唤醒的等待,必须有机会去判断线程的状态,如果不满足就会造成 KILL 失败

典型场景:innodb_thread_concurrency 为 2,代表并发线程上限数设置为 2

  • session A 执行事务,session B 执行事务,达到线程上限;此时 session C 执行事务会阻塞等待,session D 执行 kill query C 无效
  • C 的逻辑是每 10 毫秒判断是否可以进入 InnoDB 执行,如果不行就调用 nanosleep 函数进入 sleep 状态,没有去判断线程状态

补充:执行 Ctrl+C 的时候,是 MySQL 客户端另外启动一个连接,然后发送一个 KILL QUERY 命令


终止连接

断开线程的连接:

KILL CONNECTION id

断开连接后执行 SHOW PROCESSLIST 命令,如果这条语句的 Command 列显示 Killed,代表线程的状态是 KILL_CONNECTION,说明这个线程有语句正在执行,当前状态是停止语句执行中,终止逻辑耗时较长

  • 超大事务执行期间被 KILL,这时回滚操作需要对事务执行期间生成的所有新数据版本做回收操作,耗时很长
  • 大查询回滚,如果查询过程中生成了比较大的临时文件,删除临时文件可能需要等待 IO 资源,导致耗时较长
  • DDL 命令执行到最后阶段被 KILL,需要删除中间过程的临时文件,也可能受 IO 资源影响耗时较久

总结:KILL CONNECTION 本质上只是把客户端的 SQL 连接断开,后面的终止流程还是要走 KILL QUERY

一个事务被 KILL 之后,持续处于回滚状态,不应该强行重启整个 MySQL 进程,应该等待事务自己执行完成,因为重启后依然继续做回滚操作的逻辑

获取方式。

因为字数较多无法一次性全部上传,可以点击链接进行保存下载。
夸克网盘
百度网盘

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 安装全攻略:从入门到上手

Docker 安装全攻略&#xff1a;从入门到上手 在当今的软件开发与部署领域&#xff0c;Docker 已经成为了一项不可或缺的关键技术。它能够将应用程序及其依赖项打包成轻量级、可移植的容器&#xff0c;极大地简化了开发、测试和部署的流程。本文将详细讲解在不同操作系统下 Doc…

mysql建立主从集群

mysql建立主从集群需要多个mysql服务器&#xff0c;主从数据库是通过log日志来进行同步的&#xff0c;所以需开启log-bin。本地安装多个mysql参考底部 主数据库配置 打开主数据库my.ini配置文件&#xff0c;给其配置server_id1 [mysqld] port3306 basedirD:/phpstudy_pro/1/…

curl+openssl 踩坑笔记

curl编译&#xff1a;点击跳转 踩坑一 * SSL certificate problem: unable to get local issuer certificate * closing connection #0 curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: https://curl.se/docs/sslcerts.html …

【开源免费】基于SpringBoot+Vue.JS租房管理系统(JAVA毕业设计)

本文项目编号 T 102 &#xff0c;文末自助获取源码 \color{red}{T102&#xff0c;文末自助获取源码} T102&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

小程序配置文件 —— 13 全局配置 - window配置

全局配置 - window配置 这里讲解根目录 app.json 中的 window 字段&#xff0c;window 字段用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff1b; 状态栏&#xff1a;顶部位置&#xff0c;有网络信号、时间信息、电池信息等&#xff1b;导航条&#xff1a;有一个当…

BLE core 内容整理解释

本文内容比较杂散&#xff0c;只是做记录使用&#xff0c;后续会整理的有条理些 link layer 基本介绍 **Link Layer Control&#xff08;链路层控制&#xff09;**是蓝牙低功耗&#xff08;BLE&#xff09;协议栈的核心部分&#xff0c;负责实现设备间可靠、安全、低功耗的数…

【目标跟踪+人流计数+人流热图(Web界面)】基于YOLOV11+Vue+SpringBoot+Flask+MySQL

前言 本系统是基于YOLOv11SpringBootVueFlaskMySQL的人流计数、人流热图系统&#xff08;包含YOLO全系列&#xff09; 系统可以上传视频选择yolo模型进行人流计数。还支持自主划定检测区域&#xff0c;行人轨迹追踪、查看计数结果等功能。 可支持人流计数、人流热图以及人流热…

vuex - 第一天

思维逻辑 解决问题 代码能力2 vue2的项目 北京前端鸿蒙6期 语雀 vuex 在组件中使用 插件支持v2和v3 宏任务 和 微任务 多问问自己为什么 new的四步

什么是网络安全(Cybersecurity)?

不同组织机构对网络安全&#xff08;Cybersecurity或Cyber Security&#xff09;的定义不尽相同。从目标上来说&#xff0c;网络安全主要用于保护网络、计算机、移动设备、应用程序及数据等资产免受网络攻击&#xff0c;避免造成数据泄露、业务中断等安全问题。 网络钓鱼、勒索…

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案

问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…

虚拟机网络配置

【1】虚拟机提供的网络 桥接模式&#xff1a;可以联网&#xff0c;和主机不是同一个ip地址 NAT模式&#xff1a;可以联网&#xff0c;虚拟机和主机是同一个ip地址 仅主机模式&#xff1a;不能联网&#xff0c;可以实现虚拟机和主机之间的通信 【2】虚拟机是否能连接网络 …

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器

STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器 1、按键控制 LED 按键:常见的输入设备&#xff0c;按下导通&#xff0c;松手断开 按键抖动:由子按键内部使用的是机械式弹簧片来进行通断的、所以在按下和松手的瞬间会伴随有一连串的抖动 按键控制LED接线图&#xff1a; 要有工程…

2024/12/29周报

文章目录 摘要Abstract粒子群优化文献研究背景污水处理面临的挑战现有优化方法的局限性 研究方法基于BSM1仿真平台的污水处理建模动态多目标粒子群优化算法&#xff08;DMOPSO-CD&#xff09;多目标优化控制架构&#xff08;SOFNN&#xff09; 研究过程研究结果与分析总结 摘要…

C#冒泡排序

一、冒泡排序基本原理 冒泡排序是一种简单的排序算法。它重复地走访要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成。 以一个简单的整数数…

科技云报到:人工智能时代“三大件”:生成式AI、数据、云服务

科技云报到原创。 就像自行车、手表和缝纫机是工业时代的“三大件”。生成式AI、数据、云服务正在成为智能时代的“新三大件”。加之全球人工智能新基建加速建设&#xff0c;成为了人类社会数字化迁徙的助推剂&#xff0c;让新三大件之间的耦合越来越紧密。从物理世界到数字世…

Node项目——从0开始构建且共享至Gitee

从0开始构建一个Node.js项目涉及多个步骤&#xff0c;包括设置开发环境、初始化项目、安装依赖、编写代码以及配置版本控制等。以下是一个详细的步骤指南&#xff1a; 1. 安装Node.js和npm 首先&#xff0c;确保你已经安装了Node.js和npm&#xff08;Node Package Manager&am…

LabVIEW故障诊断中的无故障数据怎么办

在使用LabVIEW进行故障诊断时&#xff0c;可能会面临“无故障数据”的情况。这种情况下&#xff0c;缺乏明确的故障参考&#xff0c;使得系统难以通过传统对比法进行故障识别。本文将介绍应对无故障数据的关键策略&#xff0c;包括数据模拟、特征提取和基于机器学习的方法&…

3_TCP/IP连接三次握手与断开四次挥手

TCP/IP 通信是网络通信的基础协议&#xff0c;分为以下主要步骤&#xff1a; 1、建立连接&#xff08;三次握手&#xff09; 目的&#xff1a;保证双方建立可靠的通信连接。 过程&#xff1a; 1>客户端发送 SYN&#xff1a;客户端向服务器发送一个 SYN&#xff08;同步&…

【黑马头条训练营】day02-黑马头条-App端文章展示

目录 描述app端首页从请求到数据显示的全部流程 描述文章微服务的组成及首页展示业务与实现 自己编写文章微服务关键逻辑 描述app端首页从请求到数据显示的全部流程 浏览器请求我们的app端 会通过nginx请求到我们app前端 app端输入手机号和密码 点击登录 请求 会到我们的…

算法进阶:贪心算法

贪心算法是一种简单而直观的算法思想&#xff0c;它在每一步选择中都采取在当前状态下最优的选择&#xff0c;以期望最终得到全局最优解。贪心算法通常适用于一些具有最优子结构的问题&#xff0c;即问题的最优解可以通过一系列局部最优解的选择得到。 贪心算法的基本思路是&a…