数据库高级

news2024/12/22 20:34:59

数据库高级🦅

文章目录

  • 数据库高级🦅
    • 范式🦍
      • 什么是范式🐊
      • 第一范式——1NF🦖
      • 第二范式——2NF🐟
      • 第三范式——3NF🐉
      • 总结🐙
    • 五大约束🐏
      • 主键约束🐡
      • 外键约束🐚
      • 唯一性约束🐞
      • 非空约束🐜
      • 检查约束🐝
    • 存储过程(了解)🐄
      • 创建存储过程🦋
      • 存储过程的优缺点🦕
    • 视图🦥
      • 视图的使用🦆
        • 视图的创建🦚
        • 查看视图是否存在🦜
        • 查看视图中的数据🐧
        • 删除视图🦉
      • 注意🐤
    • 事务🐇
      • 手动事务管理🐘
      • 事务的特点🦡
      • 事务的隔离级别🦙
        • 隔离级别以及可能会产生的问题🦛
        • 不可重复读和幻读的区别🦄
        • 数据库的默认隔离级别🐆
    • 锁🦃
      • 锁的分类🐫
      • 死锁🐅
      • 模拟死锁的步骤🐕
      • 数据库对死锁的处理🦌
      • 悲观锁和乐观锁🐕‍🦺
    • 索引🦔
      • 索引形成目录的原理(B+Tree)🐎
      • `BTree`和`B+Tree`的不同🦘
      • 索引的分类🐿️
        • 聚集索引 / 主索引——给主键添加的索引🐂
        • 非聚集索引 / 辅助索引——给非主键字段添加的索引🐩
      • 索引的操作🐖
      • 索引的使用——什么时候用🦓
      • 索引的失效场景(面试高频)🦧

范式🦍

什么是范式🐊

范式是设计数据库表结构时主要遵守的规则,一般情况下,遵守前三个范式,设计出的表结构就是合理;若设计的表结构违反了前三个范式任意之一,表结构一定不合理

百度百科描述

设计关系数据库中表结构时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小

关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)

范式来自英文Normal form,简称NF。要想设计一个好的关系,必须使关系满足一定的约束条件,此约束已经形成了规范,分成几个等级,一级比一级要求得严格。满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息

关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般来说,数据库只需满足第三范式(3NF)就行了

第一范式——1NF🦖

所谓第一范式(1NF)是指在关系模型中,对于添加的一个规范要求,所有域都是原子性的,即数据库表的每一列都是不可分割的原子数据项,不是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体旳一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域

说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型

解读:所有的列必须是原子性的

第二范式——2NF🐟

在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)

  • 候选码:在表中可以用于唯一的表示一条记录,作为主键的候选存在
  • 非码属性:非候选码

第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作为实体的唯一标识。例如在员工表中的身份证号码即可实现每个员工的区分,该身份证号码即为候选键,任何一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被添加的编号或ID选作主键。(该主键的添加是在ER设计时添加,不是建库时随意添加)

第二范式(2NF)要求实体的属性完全依赖于主关键字,所谓完全依赖是指存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是对多的关系,为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。

解读:非码属性必须完全依赖于候选码,消除非主属性对主码的部分函数依赖

第三范式——3NF🐉

在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传递依赖于主属性。

总结🐙

  • 第一范式:指所有的列必须是原子性的
  • 第二范式:非码属性必须完全依赖于候选码
  • 第三范式:非主属性不能依赖于其他非主属性

五大约束🐏

约束:(constraint)添加在表中的某个 / 某些字段上,使得字段的值必须遵循某一些特定的约束

主键约束🐡

primary key  
# 特点 元素唯一且非空
eg:
create table t_name(
	id int primary key,
    ...
)

外键约束🐚

foreign key  
# 作用 A表中的非主键字段引用自另一个表中的主键字段,则该字段称为外键  一个表可设置多个外键
# 特点 若某个主键值作为外键使用,则外键中使用该主键值的期间,该主键值无法删除(除非将外键值中的引用全部删除)
eg:
create table t_name(
	id int primary key
    name varchar(20),
    dept_id int,
    foreign key(dept_id)  references dept(id)
)

唯一性约束🐞

unique
# 特点 字段的值唯一存在,不可重复
eg:
create table t_name(
	id int primary key,
    name varchar(20) unique,	#可以为空,但空只有一次
    age int
)

非空约束🐜

not null  
# 特点 字段的值不允许为null
eg:
create table t_name(
	id int primary key,
    name varchar(20) unique,
    age int not null
)

检查约束🐝

check 
# 作用 添加给某字段,向该字段添加值时,会检查添加的值是否满足检查约束给出的条件
# 注意 mysql不支持检查约束,sql server,Oracle,Mariiadb10.xx均支持
eg:
create table t_name(
	id int primary key,
    name varchar(20),
    age int check(age between 10 and 20)	#两个边界值均包含
)

存储过程(了解)🐄

存储过程:(procedure)用于封装一段过程,封装之后,后续若要再次调用该过程,调用名称即可,在有多个sql语句的业务中,若后期其他地方也要执行该操作,若将所有sql语句重写一遍,可实现结果,但若后期是多次执行以上操作,多次重写以上sql,编写代码效率相当低效,应该将过程进行提取,就可以使用存储过程来封装该过程,后期若想再次执行该过程,直接调用存储过程名即可

创建存储过程🦋

create procedure name(xx,xx,xx)
begin 
	select...;
	delete...;
	update...;
	...
end$$
#修改结束符,存储过程结束符默认是;  但是每条sql语句后也是,结束符需要进行修改  设置方式:  delimiter $$  设置结束符为$$

# 调用存储过程
call name(...)

存储过程的优缺点🦕

优点:

  • 存储过程可封装,并隐藏复杂的商业逻辑。
  • 存储过程可以回传值,并可以接受参数。
  • 存储过程无法使用SELECT指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
  • 存储过程可以用在数据检验,强制实行商业逻辑等。

缺点:

  • 存储过程,往往定制化于特定的数据库上,可移植性差。因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
  • 存储过程的性能调校与撰写,受限于各种数据库系统。

视图🦥

视图:(view)用于保存查询的结果集,视图中并不保存数据,视图是张虚拟表,但其数据来源于真实表中视图实质上时用于封装查询语句的。如:列表页面中要查询2个表中满足一些条件的部分数据,此时就会使用两表联查,将结果展示给用户,假设在其他位置也要显示刚才的查询结果,若将刚才的sql语句重写多次,不符合编程规范,此时就应该将以上的查询语句进行提取,提取之后哪里需要再次查询该结果,直接调用该sql语句即可。此时使用视图来保存查询的结果集,其实质为使用视图来封装刚才的查询语句,后期其他地方若要再次查询该结果,直接调用视图即可,即可查询到对应的数据。

视图的使用🦆

视图的创建🦚

# 查询所有员工数据,包括部门名称
select emp1.*,d.name from dept d join emp1 e on d.id = e.dept.id

# 创建视图
create view v_emp as select...
create view v_emp(col1,col2,...) as select... #解决视图中的列名冲突

查看视图是否存在🦜

show tables

查看视图中的数据🐧

select * from v_emp

删除视图🦉

drop view v_emp

注意🐤

  • 视图是虚拟表,并不保存数据,其数据来源于真实表中
  • 真实表中的数据发生改变,视图的结果也会发生改变
  • 视图是用来保存查询结果的,并不用于执行写操作,逻辑角度上,不应该对视图进行增删改操作,但物理角度上,如果一定要对视图执行写操作,一定程度上是可以成功的
    • 对视图执行改操作,不论视图来源于单表还是多表 ,都成功
    • 对视图执行增删操作,视图来源于单表可成功,来源于多表不成功

事务🐇

事务:事务是数据库中最小的执行单元,不可再分,要么全部成功,要么全部失败

手动事务管理🐘

-- 事务管理: 开启事务 -> 提交事务 / 事务回滚 
-- 数据库中的事务管理默认是开启的
	-- 增删改执行时,在他们执行之前,事务自动开启,执行成功后,事务自动提交
	-- 查不涉及事务
-- 如何查看数据库的事务管理是否开启
show variables like 'autocommit'
-- 设置事务管理自动提交为关闭
set autocommit = off
-- 事务相关命令
begin #开启事务
commit #提交事务
rollback #事务回滚

事务的特点🦡

  • 原子性:事务是最小的执行单元,不可再分,要么全部成功,要么全部失败
  • 一致性:事务从一个 有效的状态(valid)切换到另一个有效的状态
  • 隔离性:事务之间彼此隔离,互不影响(事务的内部对外不可见)
  • 持久性:事务提交后,所做的操作会持久化到数据库中

事务的隔离级别🦙

  • 读未提交:read uncommited

    两个事务并发执行时,一个事务可读取到了另一个事务未提交前的数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jGSbPjZs-1687442499847)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622165647477.png)]

    隔离级别为 读未提交,此时会产生 脏读,产生原因是读取到了其他事务未提交 / 回滚前的数据,如何解决脏读:将隔离级别设置为 读已提交

  • 读已提交:read commited

    事务只能读取其他事务提交 / 回滚后的数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PiHQaJIz-1687442499849)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622170357362.png)]

    隔离级别为 读已提交,解决了 脏读 问题,但是产生了新的问题 不可重复读,产生原因是在事务A执行期间,其他事务对用户1数据进行了修改,如何解决不可重复读:给事务操作的数据加锁,将隔离级别设置为 可重复读

  • 可重复读:repeatable read

    给事务操作的数据加锁

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mf5cyXTZ-1687442499849)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622170821126.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gEAat3tQ-1687442499849)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622171206192.png)]

    隔离级别为 可重复读,解决了 脏读不可重复读 问题,问题,但是产生了新的幻读 问题 产生原因是在事务A执行期间,其他事务允许操作本事务的表进行增删操作,如何解决幻读:给表加锁,将隔离级别设置为 可串行化

  • 可串行化:serializable

    两事务同时并发执行,执行同一张表时,事务A先给表加锁,事务B阻塞,等待事务A执行结束,事务B开始执行,其隔离级别最高,并发执行效率最低,(此时事务变成同步执行)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3hbNp8JL-1687442499850)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622172301609.png)]

隔离级别以及可能会产生的问题🦛

脏读不可重复读幻读
读未提交
读已提交×
不可重复读××
可串行化×××

注意:隔离级别越高,事务并发执行效率越低

不可重复读和幻读的区别🦄

  • 不可重复读和幻读很像,都是同一事务前后两次查询的数据不一致
  • 不可重复读:指同一事务查询同一条数据结果不同,即同一条数据不能重复读,针对的是其他事务对本事务的修改操作
  • 幻读:指同一事务前后两次读取到的数据总量不同,即总数据量不同,针对的是其他事务对本事务原来数据的增删操作

数据库的默认隔离级别🐆

  • mysql默认的隔离级别是 可重复读
  • sql serveroracle 的默认隔离级别是 读已提交

注意:mysql的隔离级别为可重复读,但是不会产生幻读,其解决方法是,mysql在事务中会采用快照读保留第一次查询到的数据,后续若再次执行相同的查询,直接快照即可

锁🦃

锁的分类🐫

  • 按锁的粒度分:表锁和行锁

  • 按锁的类型分:共享锁和排他锁(独占锁) 意向共享锁、意向排他锁

    • 共享锁:给 表 / 行 添加上共享锁后,允许在此基础上再次添加共享锁,但是不允许在此基础上添加排他锁。共享锁通常作用于表

    • 排它锁:给 表 / 行 添加上排他锁后,不允许在此基础上添加任何锁。共享锁通常作用于行,也可能会作用于表。事务中对某条数据进行增删改操作,会自动给数据加排他锁

    • 手动添加 共享 / 排他锁:

      select ... for update #表示添加排他锁
      select ... for share #表示添加共享锁
      

死锁🐅

死锁:(DeadLock)死锁是一种现象,是由于排他锁相互作用,锁添加不合适导致出现的问题现象。该现象为多事务并发执行,出现了事务之间彼此阻塞,彼此无法继续执行的现象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCeCW7Jt-1687442499850)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622190726340.png)]

模拟死锁的步骤🐕

  1. 开启两个客户端,并设置自动提交为off
  2. 在事务A中修改A表中的某条数据,在事务B中修改B表中的某条数据
  3. 事务A中删除B表中操作的那条数据,此时会出现阻塞
  4. 事务B中删除A表中操作的那条数据,此时会检测到死锁,数据库会对死锁进行处理

数据库对死锁的处理🦌

不同版本对死锁处理方式可能不同,整体分为两种处理方式:

  1. 发现死锁的位置,让当前事务回滚,让另一个事务继续执行
  2. 发现死锁后,互相阻塞一段时间,若超过规定的时间,给出超时提醒

悲观锁和乐观锁🐕‍🦺

悲观锁和乐观锁是两种思想

  • 悲观锁是基于数据库中的排他锁实现的,乐观锁没有使用数据库中的锁

  • 悲观锁:在多线程并发执行时,有可能会产生线程安全问题,为了保证线程安全,悲观锁是指:某个线程总是悲观的认为在自己执行期间,总有其他线程与之并发执行,此时可能会产生线程安全问题,为了保证线程安全,当前线程直接给操作数据加排它锁,从而保证线程安全。这种方式在保证线程安全的同时并发执行效率低

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7onPz7O-1687442499851)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622194515094.png)]

    • 悲观锁的应用:Java中的synchronized,数据库中的排他锁等
  • 乐观锁:在多线程并发执行时,某线程总是乐观的认为,在其执行期间没有人与之并发执行,所以不会给对象加锁,但是实际上确实可能存在线程与之并发,就有可能产生线程安全问题,此时为了保证线程安全,采用版本号机制。这种方式可以实现在保证线程安全的同时提高并发执行效率

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4B0Ga3Ks-1687442499851)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622195004201.png)]

    • 乐观锁的应用:Java中的ConcurrentHashMap

索引🦔

索引:(index)索引是作用于列上,为该列的数据形成目录,从而提高该列数据的查询效率。索引通常作用于数据量大的表中

索引形成目录的原理(B+Tree)🐎

索引的数据结构是B+tree,该数据结构可将数据形成目录

  • B+Tree是对BTree进行了优化

    BTree

    BTree对所有元素进行了排序,是一颗度可以自定义的树,每个节点位置保存的是一个数据块,而不是每个元素,定义好n后,则每个数据块中最多可以保存n-1个元素,当数据块中的元素数量到达n时,此时这个数据块会进行分裂提取,将最中间的元素进行提取,提取到上一级的数据块中,中间元素两侧分裂成2个数据块,依然存在这一层中

    好处:数据量大的数据形成BTree,查询的次数会降低,从而提高查询效率

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fdCTO0MK-1687442499852)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622200052984.png)]

  • B+Tree是在BTree基础上扩展而来的

    B+Tree

    B+Tree是基于BTree扩展而来的,都实现了元素的排序,和BTree一样都会进行分裂提取,度设置好后,每个数据块中保存的最大元素数量也确定,为n-1个元素,当数据块中的元素数量达到n,此时进行分裂提取,但和BTree不同的是,若从叶子节点中提取元素,提取后,该元素依旧存在于叶子节点中,若从非叶子节点中提取元素,提取到上一级后,该元素不再存在原来那一层中

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zr7yRju1-1687442499852)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622202359340.png)]

BTreeB+Tree的不同🦘

  1. 提取后的元素是否存在于原层级
    • 若从叶子节点中提取元素,提取到上一级后,该元素还存在于叶子节点上
    • 若从非叶子节点中提取元素,提取到上一级后,该元素不再存在于原来那一级
  2. B+Tree中叶子节点的数据块之间有链表进行维护(有序的),好处是可以提高区间范围内数据查询的效率(eg:查询11-15之间所有元素,B+Tree在叶子节点查到11后根据叶子节点上的链表即可顺序查找直到15的全部元素,不用像BTree可能还要多次从数据结构中查询多个值)

索引的分类🐿️

聚集索引 / 主索引——给主键添加的索引🐂

mysql的存储引擎:

  • mysql5.x开始,存储引擎为Innodb,该存储引擎支持事务和行锁,会自动给每张表的主键字段添加索引(聚集索引),若表中没有主键,则自动为添加lunique约束的字段添加索引,若都没有,此时Innodb会自动为表添加一个主键,类型为long,长度为 6 ,为该主键添加聚集索引

聚集索引构建B+Tree时的特点

  • 所有的索引构建的树中所有的叶子节点数据块中每个元素保存的都是key-value,聚集索引的叶子节点中key-value分别保存的是:key保存的是主键,value保存的是该主键对应的一行数据

  • 根据主键查询数据时,可以很快的找到对应的行数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bFUgp1Uw-1687442499853)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622205809186.png)]

非聚集索引 / 辅助索引——给非主键字段添加的索引🐩

非聚集索引构建B+Tree时的特点

  • 非聚集索引的叶子节点中key-value分别保存的是:key保存的是添加了索引的字段的值,value主键

  • 非聚集索引添加给某字段后,后期查询时根据字段找到id,再根据id去聚集索引中查询对应的数据

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p8xTXxXM-1687442499853)(../../../AppData/Roaming/Typora/typora-user-images/image-20230622211508979.png)]

如果没有创建id,非聚集索引中的value值,系统会默认创建id进行填充吗?

同样,没有主键存储引擎会自动为表添加一个主键,类型为long,长度为 6 ,为该主键添加聚集索引,那么非聚集索引的value值指向这个主键,再次查到主键对应的值

非聚集索引的底层是聚集索引的话,那为啥还要分非聚集索引呢?

真实查询条件根据业务需求进行查询,业务中不止是只通过id进行查询数据,若数据量大情况下,业务中还会使用到如名字等其他字段,此时若添加索引即添加非聚集索引

索引是如何提高查询效率的

  1. 构建树结构,可以大大降低对磁盘的 IO操作(对磁盘进行 IO操作 时间级别为ms)
  2. 读取到数据块后,会将数据块缓存到内存中,之后对内存进行 IO操作,来遍历元素从而进行大小判断,也会提高查询效率(对内存的 IO操作 时间级别为ns)

索引的操作🐖

  • 创建索引:

    create index index_name on table(col)
    
  • 查询索引:

    show index from table_name
    
  • 删除索引:

    drop index index_name on table_name
    

索引的使用——什么时候用🦓

  1. 当表中数据量大时,为了提高查询效率,应该使用索引,即表数据量小时,不应选择索引
  2. 当某字段的值会被频繁修改时,不应该使用索引,因为值修改后会导致索引的重构,某些字段的值几乎是不变,或被修改的频率很低,此时这个字段就适合添加索引
  3. 索引并不是随意添加给某个字段的,通常是作为查询条件的字段添加索引的
  4. 一个表的索引不是越多越好,适量就行,最多最多5、6个,因为索引的创建也是需要耗时间的,且索引多占用的额外内存也越多

索引的失效场景(面试高频)🦧

索引失效不是指索引消失了,而是在一些场景会放弃使用索引,执行全表扫描

  1. 对添加了索引的字段进行了运算,此时会放弃索引,执行全表扫描

    eg: select ... from ... where age + 4 > 12
    
  2. 对添加了索引的字段使用了函数,此时会放弃索引,执行全表扫描

    eg: select ... from ... group by .. having max(age) = 12
    eg: select ... sum(xx) from ... 
    
  3. 对添加了索引的字段使用了左模糊查询,此时会放弃索引,执行全表扫描

    eg: select ... from ... where xx like '%_xx'
    
  4. 对添加了索引的字段使用了not in,此时会放弃索引,执行全表扫描

    eg: select ... from ... where age not in (11,12,23)
    

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

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

相关文章

第五章 ResNeXt网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

网络套接字函数 | socket、bind、listen、accept、connect

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

CSS3-补充-结构伪类选择器

结构伪类选择器 作用:在HTML中定位元素 优势:减少对于HTML中类的依赖,有利于保持代码整洁 场景:常用于查找某父级选择器中的子元素 选择器: 选择器 …

SAC算法小结

算法SAC 基于动态规划的贝尔曼方城如下所示: 则,基于最大熵的软贝尔曼方程可以描述为如下的形式: 可以这么理解soft贝尔曼方程,就是在原有的贝尔曼方程的基础上添加了一个熵项。 另外一个角度理解soft-贝尔曼方程: …

Vue-组件自定义事件(绑定和解绑)

组件自定义事件(绑定) 像click,change这些都是js的内置事件,我们可以直接使用,本次我们学习自己根据需求打造全新的事件,但是js内置的是给html元素用的,本次的自定义事件是给组件用的 注意:组件上也可以绑定原生DOM事件&#xf…

(十一)CSharp-LINQ(1)

一、LINQ 数据库可以通过 SQL 进行访问,但在程序中,数据要被保存在差异很大的类对象或结构中。由于没有通用的查询语言来从数据结构中获取数据。所以可以使用 LINQ 可以很轻松地查询对象集合。 LINQ 高级特性: LINQ 代表语言集成查询。LIN…

【机器学习】信息熵和信息度量

一、说明 信息熵是概率论在信息论的应用,它简洁完整,比统计方法更具有计算优势。在机器学习中经常用到信息熵概念,比如决策树、逻辑回归、EM算法等。本文初略介绍一个皮毛,更多细节等展开继续讨论。 二、关于信息熵的概念 2.1 …

尚硅谷课程vue学习(一)

目录 data两种写法el两种写法由vue管理的函数,一定不要写箭头函数,不然this指向windows实例了MVVM模型defineProperty属性数据代理v-on: v-bind:键盘事件keyup keydowncomputed计算属性监视属性watch监视属性和计算属性区别绑定class和style属性条件渲染…

cocosCreator 3.3~6 安卓热更新官方详细示例

官方的热更新虽给出了示例和源码,但是一些细节的地方和步骤还是没说清楚,导致新手包括我死活是运行不起来,热更新失败!很打击人啊。这里有必要给出新手的热更新步骤,前提是你安装了Node.js和python环境,我装…

chatgpt赋能python:更新Python所有库,避免安全漏洞和兼容性问题!

更新 Python 所有库,避免安全漏洞和兼容性问题! Python 是当今最受欢迎的编程语言之一,拥有强大而多功能的 API 和丰富的第三方库来支持开发,如 numpy、pandas、tensorflow 等等。但是,这些库不断地更新与改进&#x…

端午作业1

只要文件存在,就会有唯一对应的inode号,且相应的会存在一个struct inode结构体。在应用层通过open()打开一个设备文件,会对应产生一个inode号,通过inode号可以找到文件的inode结构体 根据inode结构体中文件…

【Dart语言解密】想要深入了解Dart语法和类型变量吗?

快来读读这篇文章吧!本文从Dart信息表示的角度出发,详细讲解了Dart的基础语法和类型变量。通过本文的学习,你将会对Dart语言有更深入的认识和理解,更好地掌握Dart的开发技巧和实践应用。快来一起解密Dart语言吧! 1 Da…

数据透视表 - 学习笔记

教程资源:数据透视表_哔哩哔哩_bilibili 目录 一、内容概括 数据操作: 案例: 二、数据操作 (一)数据清洗 (二)创建数据透视表 1、数据格式 2、显示方式 3、分组 4、修改数据源 5、…

Web 安全之 HSTS 详解和使用

HSTS(HTTP Strict Transport Security) 是一种网络安全机制,可用于防范网络攻击,例如中间人攻击和 CSRF(Cross-Site Request Forgery)等攻击。本文将详细介绍 HSTS 的工作原理、应用场景以及如何在网站中开…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于分类和分割的学术速递(6月 22 日论文合集)

文章目录 一、分类相关(4篇)1.1 Annotating Ambiguous Images: General Annotation Strategy for Image Classification with Real-World Biomedical Validation on Vertebral Fracture Diagnosis1.2 Benchmark data to study the influence of pre-training on explanation pe…

无需专业知识!学会用TensorFlow 2实现天气识别的秘诀

💡《目标识别100例》使用的是Python语言、TensorFlow框架,包含了几十种CNN算法案例💎 附有 🖥 源码 ,可一键运行,避免调试烦恼🏆 课程大作业、毕业论文可直接考借鉴🎈 同时 附带各种算法原理及对应的代码教程,用户可根据自身情况快速排列组合,在不同的数据集上实…

从零开始:入门双目视觉你需要了解的知识

文章目录 前言 双目相机标定去畸变极线校正(立体校正)立体匹配深度图生成文章已经同步更新在3D视觉工坊啦,原文链接如下: 前言 双目立体视觉是计算机视觉中的一个重要领域,它利用两个相机拍摄同一场景的不同视角的图像…

HDLBits笔记5:Circuits.Combinational Logic.Basic gates

Wire 实现一个电路完成in和out的连线 module top_module (input in, output out);assign out in; endmoduleGND 实现一个电路将out连到GND module top_module (output out);assign out 1b0; endmoduleNOR 实现或非门 module top_module (input in1,input in2,output ou…

Vue-消息订阅与发布(pub/sub)

消息订阅与发布(pub/sub) 消息订阅与发布和全局事件总线一样,也是一种组件间通信的方式 pub/sub全称为publisher(订阅)/subscriber(发布),一般需要数据的人订阅消息,提供数据的人发布消息 这个技术非常简单容易上手,主要有以下两步 1 订阅…

Java集合之ArrayList详解

Java集合之ArrayList 一、ArrayList类的继承关系1. 基类功能说明1.1. Iterator:提供了一种方便、安全、高效的遍历方式。1.2. Collection:为了使ArrayList具有集合的基本特性和操作。1.3. AbstractCollection:提供了一些通用的集合操作。1.4.…