【MYSQL】索引与事务(超详细)

news2024/11/22 20:55:02

文章目录

  • 🌷 1.索引
    • ⭐️ 1.1 定义
    • ⭐️ 1.2 为什么要用索引
    • ⭐️ 1.3 作用
    • ⭐️ 1.4 使用场景
    • ⭐️ 1.5 使用
      • 🍁 1.5.1 查看索引
      • 🍁 1.5.2 创建索引
      • 🍁 1.5.3 删除索引
    • ⭐️ 1.6 创建索引的⽅式
    • ⭐️ 1.7 选择索引的数据结构(面试常问)
      • 🍁 1.7.1 HASH
      • 🍁 1.7.2 ⼆叉搜索树
      • 🍁 1.7.3 N叉搜索树,B 树
      • 🍁 1.7.4 B+树
    • ⭐️ 1.8 ⽤explain 查看执⾏计划
      • 🍁 使用explain
    • ⭐️ 1.9 索引覆盖
    • ⭐️ 1.10 索引失效
  • 🌷 2. 事务
    • ⭐️ 2.1 为什么使用事务
    • ⭐️ 2.2 事务的概念
    • ⭐️ 2.3 使用
    • ⭐️ 2.4 事务的特性
    • ⭐️ 2.5 事务的隔离级别
      • 🍁 2.5.1 什么是隔离级别?
      • 🍁 2.5.2 mysql中的四种事务隔离级别
      • 🍁 2.5.3 使用
      • 🍁 2.5.4 不同隔离级别的现象
        • 1. `脏读`
          • 解决脏读问题:
        • 2. `不可重复读`
          • 解决不可重复读问题
        • 3. `幻读`

🌷 1.索引

⭐️ 1.1 定义

索引:为了提高查询效率而使用一种数据结构把数据组织起来。可以把索引理解在书的⽬录或字典的检索表(拼⾳检索)。
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现

⭐️ 1.2 为什么要用索引

为了提⾼查询效率。
这是⼀个是典型的以空间换时间的操作,刚才说了,创建索引也要占⼀定的空间,⽽且在数据新增和删除的时间开销还是⽐较⼤的,因为不但要更新数据⾏,还是更新索引
⽐如,⼀书本在修订的时候增加或删除了⼀部分内容,那么后⾯的内容对应的⻚码全都改变了,所以⽬录也要做相应的调整。
如果没有索引,那么查找时可能需要全整的遍历整个数据集,时间复杂度最坏就是O(N)
有了索引之后,就可以通过⻚码,快速定位⼀个范围,然后再这个⼩范围内去找,这时的时间复杂度就⼤⼤降低了。

⭐️ 1.3 作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助。

⭐️ 1.4 使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低
  • 索引会占用额外的磁盘空间

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。索引一般创建在频繁查询的列上,且这个列中的值重复较少。

⭐️ 1.5 使用

🍁 1.5.1 查看索引

show index from 表名;

案例:查看学生表已有的索引

show index from student;

在这里插入图片描述

🍁 1.5.2 创建索引

对于非主键、非唯一约束、非外键的字段,可以创建普通索引(字段名可以有多个,用逗号隔开,一个索引包含多个字段就叫组合索引)

create index 索引名 on 表名(字段名);
create index 索引名 on 表名(字段名1,字段名2...);

案例:创建班级表中,name字段的索引

create index idx_classes_name on classes(name);

🍁 1.5.3 删除索引

drop index 索引名 on 表名;

案例:删除班级表中name字段的索引

drop index idx_classes_name on classes;

⭐️ 1.6 创建索引的⽅式

  1. 创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。
  2. ⼿动创建,业务中我想对学⽣的身份证号建⽴⼀个索引:
    create index idx_student_idcard on student(idcard);
  3. ⼀张表⾥⾄少会有⼀个索引
    a. 如果⼀张表⾥没有主键,MySql会为每⼀⾏⽣成⼀个唯⼀的字段,并⽤这个字段当前做索引
    b. 如果⼀张表⾥有主键,那么主键必然是索引,主键索引也叫聚簇索引, ⽽且⼀直存在这也是我们绝⼤部分情况下的使⽤场景
    c. 如果⾃⼰⼿动创建索引,那会会为这个列或是列的组合(多个列)创建单独的索引,⾮聚簇索引
  4. 分类:
    a. 按使⽤场景分:普通索引,主键索引,唯⼀索引,全⽂索引
    b. 按数据组织⽅式分:聚簇索引,⾮聚索引
    c. 还有⼀种数据查找过程中出现的现象叫索引覆盖

⭐️ 1.7 选择索引的数据结构(面试常问)

题外话:推荐一个做数据结构图的链接(非常好用!!!):
Data Structure Visualizations

🍁 1.7.1 HASH

查询和插⼊的时间复杂度是O(1).
Hash这种数据结构快是快,但是他不适合做数据库的索引,为什么叫呢?因为他不⽀持做范围查询,⼤于号⼩于号 between and 这种操作,是不⽀持的。
不清楚为什么不支持范围查询的朋友可以看一下这篇:哈希表

🍁 1.7.2 ⼆叉搜索树

⼆叉搜索树的时间复杂度是多少,O(logN), O(N)
红⿊树是O(logN),因为红⿊树可以动态调整树⾼,不会出现单边树的情况.

那红⿊适合不适合做索引底层的数据结构呢?
答:不适合, 为什么呢? ⼆叉搜索树的中序遍历是⼀个有序数组。
没有办法控制树的⾼度,树的⾼度决定了磁盘的访问次数,咱们先这么理解,每向孩⼦节点访问⼀级,就发⽣了些磁盘IO,⽽在⼀个系统中,对性能影响最⼤的就是磁盘IO,所以就要有⼀种数据结构能有效控制树的⾼度。

在这里插入图片描述

🍁 1.7.3 N叉搜索树,B 树

在这里插入图片描述
可以规定每⼀个节点可以存多少个元素,当节点中达到了规定的元素个数时,才去调整,B树就可以解决树⾼的问题,那么N叉搜索树可以做为索引的数据结构吗,看上去好像是可以的,但是Mysql没有选这种数据结构,⽽是在这B树的基础上⼜做了优化。

🍁 1.7.4 B+树

在这里插入图片描述
观察上图可以发现:

1️⃣ ⾮叶⼦节点中的每个数据都存在于叶⼦节点中,并且都是对应所在叶⼦节点中的第⼀条数据
2️⃣ Mysql中的B+树是⼀个循环双向链表,相邻节点是通过双向链表连接的,这样组织数据更有利⽤范围查找
3️⃣ 最重要的是,叶⼦节点中的数据是有序的,所以支持范围查找!
4️⃣ N叉搜索树,有效的降低了树的⾼度,从⽽减少了磁盘IO次数
5️⃣ 对于B+树⽽⾔,在相同树⾼的情况下,查找任⼀元素的时间复杂度都⼀样,中间⽐较次数也差不多,也就是说性能均衡,只要控制树⾼,就可以达到性能可控的效果
6️⃣ 只有叶⼦⻚点存储了真实完整的数据,⾮叶⼦⻚点,只保存了主键(索引)的值和⼦节点的引⽤

⭐️ 1.8 ⽤explain 查看执⾏计划

语法:

explain 查询语句;

案例:

explain select id,sn,name from student where id = 1 or sn = '09982' or qq_mail = '123';
explain select id,sn,name from student where id = 1 or sn = '09982';
explain select sn from student where sn = '09982';

以下全部详细解析explain各个属性含义:

在这里插入图片描述

各属性含义:

id:查询的序列号
select_type: 查询的类型,主要是区别普通查询和联合查询、⼦查询之类的复杂查询

  • SIMPLE:查询中不包含⼦查询或者UNION,也就是单独的⼀条SQL
  • 查询中若包含任何复杂的⼦部分,最外层查询则被标记为:PRIMARY
  • 在SELECT或WHERE列表中包含了⼦查询,该⼦查询被标记为:SUBQUERY

table: 输出的⾏所引⽤的表
type:访问类型
在这里插入图片描述
从左⾄右,性能由差到好。

  1. ALL: 扫描全表
  2. index: 扫描全部索引树
  3. range: 扫描部分索引,索引范围扫描,对索引的扫描开始于某⼀点,返回匹配值域的⾏,常
    ⻅于between、<、>等的查询
  4. ref:使⽤⾮唯⼀索引或⾮唯⼀索引前缀进⾏的查找,不是主键或不是唯⼀索引
    (eq_ref和const的区别:)
  5. eq_ref: 唯⼀性索引扫描,对于每个索引键,表中只有⼀条记录与之匹配。常⻅于主键或唯⼀
    索引扫描
  6. const, system: 单表中最多有⼀个匹配⾏,查询起来⾮常迅速,例如根据主键或唯⼀索引查
    询。system是const类型的特例,当查询的表只有⼀⾏的情况下, 使⽤system。
  7. NULL: 不⽤访问表或者索引,直接就能得到结果,如:
    在这里插入图片描述

possible_keys: 表示查询时可能使⽤的索引。如果是空的,没有相关的索引。这时要提⾼性能,可通过检验WHERE⼦句,看是否引⽤某些字段,或者检查字段不是适合索引
key: 显示MySQL实际决定使⽤的索引。如果没有索引被选择,是NULL
key_len: 使⽤到索引字段的⻓度
注:key_len显示的值为索引字段的最⼤可能⻓度,并⾮实际使⽤⻓度,即key_len是根据表定义计算⽽得,不是通过表内检索出的。
ref: 显示哪个字段或常数与key⼀起被使⽤
rows: 这个数表示mysql要遍历多少数据才能找到,表示MySQL根据表统计信息及索引选⽤情况,估算的找到所需的记录所需要读取的⾏数,在innodb上可能是不准确的
Extra: 执⾏情况的说明和描述。包含不适合在其他列中显示但⼗分重要的额外信息。

  1. Using index: 表示使⽤索引,如果只有 Using index,说明他没有查询到数据表,只⽤索引表就完成了这个查询,这个叫覆盖索引。
  2. Using where: 表示条件查询,如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where。
    针对⾃定义或是普通索引、⾃定义索引组合索引⽽⾔

🍁 使用explain

(1)在student中创建索引

create index idx_sn_name on student(sn,name); 

在这里插入图片描述
(2)执⾏查询计划

 explain select * from student where sn = '09982';

① 查询所有使⽤主键索引

explain select * from student where id = 1;

在这里插入图片描述
② 查询所有使⽤了复合索引

  1. 有回表查询
explain select * from student where sn = '9982';
  1. ⽆回表查询(索引覆盖)
 explain select sn student where sn = '09982';
explain select sn,name from student where sn = '09982';
explain select id,sn,name from student where sn = '09982';

⭐️ 1.9 索引覆盖

select name, mail from student where name = '张三' and mail = 'zs@163.com';

如果索引中包含要查询的所列,那么直接从索引中返回结果,这个现在叫做索引覆盖.

当查询列表中为*或索引不能完全满足查询满足,那么会使用id 到主键索引中查询完整的结果,主键索引中包含当前数据行中所有列的值

⭐️ 1.10 索引失效

create index idx_SM声⺟_YM韵⺟_SD声调 ON 字典(声⺟,韵⺟,声调);

  1. 最左原则:类似于字典的⽬录,这就是⼀个典型的复合索引
  2. 判断不等:每个都要判断
  3. 类型转换:与原类型不符
  4. like '%xxx':第⼀个字符都不能确定,怎么去索引中⽐较呢?
  5. 索引列运算 age + 1:改了原来的值
  6. is null 或 is not null : 全表扫描了

🌷 2. 事务

⭐️ 2.1 为什么使用事务

准备测试表:

drop table if exists accout;
create table accout(
 id int primary key auto_increment,
 name varchar(20) comment '账户名称',
 money decimal(11,2) comment '金额'
);

insert into accout(name, money) values
('阿里巴巴', 5000),
('十四大盗', 1000);

比如说,四十大盗把从阿里巴巴的账户上偷盗了2000元。

-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 十四大盗账户增加2000
update accout set money=money+2000 where name = '十四大盗';

假如在执行以上第一句SQL时,出现网络错误,或是数据库挂掉了,阿里巴巴的账户会减少2000,但是十四大盗的账户上就没有了增加的金额。

解决:使用事务来控制,保证以上两句SQL要么全部执行成功,要么全部执行失败。

⭐️ 2.2 事务的概念

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。
在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

⭐️ 2.3 使用

(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。

start transaction;
-- 阿里巴巴账户减少2000
update accout set money=money-2000 where name = '阿里巴巴';
-- 四十大盗账户增加2000
update accout set money=money+2000 where name = '四十大盗';
commit;

⭐️ 2.4 事务的特性

  1. 原⼦性(Atomicity)
    事务中的SQL要么都执⾏要么都不执⾏,通过commit/rollback控制
  2. ⼀致性(Consistency)
    官⽹上描述:数据库从⼀个⼀致性状态变换到另外⼀个⼀致性状态。
    事务执⾏之前与执⾏之后,要保持的正确的结果,可以⽤转账说明
  3. 隔离性(Isolation)
    多个事务执⾏的过程中不能互相⼲扰
  4. 持久性(Durability)
    事务⼀旦提交就会写⼊磁盘永久保留,即使是数据库服务故障也不会影响数据的内容

⭐️ 2.5 事务的隔离级别

MYSQL是以服务的形式发布⽹络上的,可以同时⽀持多个客户端的访问,那么多个客户端如果同时访问MYSQL时可能会出现互相影响的情况。

🍁 2.5.1 什么是隔离级别?

对并发访问的⼀种限制刚才介绍了,MYSQ可以被多个客户端访问,
如果隔离级别越低,那么可以⽀持同时访问的客户端数就越多,性能变⾼,数据安全性变低;如果隔离级别越⾼,那么可以⽀持同时访问的客户端数就越少,性能变低,数据安全性变⾼。

🍁 2.5.2 mysql中的四种事务隔离级别

  1. read uncommitted(读未提交数据):允许事务读取未被其他事务提交的变更。(脏读、不可重复读和幻读的问题都会出现)。
  2. read committed(读已提交数据):只允许事务读取已经被其他事务提交的变更。(可以避免脏读,但不可重复读和幻读的问题仍然可能出现)
  3. repeatable read(可重复读):确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新(update)。(可以避免脏读和不可重复读,但幻读仍然存在)
  4. serializable(串行化):确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作,所有并发问题都可避免,但性能十分低下(因为你不完成就都不可以弄,效率太低)

隔离级别从低到⾼,“并发访问”的数据从⾼到低,数据安全性从低到⾼,性能越低
MYSQL默认的事务隔离级别是,可重复读

🍁 2.5.3 使用

(1)查看当前事务的隔离级别

show variables like '%tx_isolation'; 

(2)修改事务的隔离级别

set @@global.tx_isolation = 'READ-UNCOMMITTED'; //全局
set @@session.tx_isolation = 'READ-UNCOMMITTED'; //当前session
set @@tx_isolation = 'READ-UNCOMMITTED'; //仅对下⼀个事务⽣效

🍁 2.5.4 不同隔离级别的现象

1. 脏读

事务B读到了另⼀个事务A还没有提交的数据,当事务A回滚后,事务中所有的修改都回滚了,那么事务B读到的数据就没有意义了,把这个称之为脏读。
在这里插入图片描述

解决脏读问题:

(1)给⼀个写操作的事务加上⼀把锁,在写这个事务从开始时加锁,事务提交或加滚的时候释放锁,被加锁的事务不能与其他事务共存,写锁也叫排他锁
在这里插入图片描述
(2)可以把当前数据库的隔离级别设置成READ-COMMITTED读已提交,就避免了脏读问题

2. 不可重复读

解决了脏读问题,⼜出现了新的问题,⽐如事务提交后对于这个事务来说就结束了,但是当⼀个新的事务A在读⼀条记录时,另⼀个事务B对这条记录做出了修改,当事务A再次读这条记录时,就发现两次读到的结果不⼀致,那么这种情况就是不可重复读
也就是当数据库的隔离级别为 READ-COMMITTED时,可能出现不可重复读的现象

解决不可重复读问题

(1)给读的事务也加上⼀把锁,但是这个锁是⼀把读锁(共享锁),多个读锁可以共存,但是由于写锁是排他锁,所以读锁不能与写锁共存,也就是说,在加了读锁之后,不能进⾏写操作。
在这里插入图片描述
(2)可以把当前数据库的隔离级别设置成REPEATABLE-READ,可以避免不可重复读问题。

3. 幻读

解决了不可重复读问题,也就是说对于⼀条记录来说,在读的时候别的事务不能修改这条记录,但是可以添加别的记录,那么当事务A对某记录进⾏修改的时候,事务B往这个表中添加了条新的记录,当然也可以删除,那么事务A再去查询所有记录时,发现与上⼀次查到的所有记录条数不⼀致,或多或少,这种现象就是幻读。

MySQL数据事务的默认隔离级别虽然是可重复读,但是最⼤限度的解决了幻读问题,但是并没有完全解决,有些场景还是会出现幻读现象,这个⼤家⼼⾥要有⼀个认识,如果要彻底解决幻读问题,那么只能把事务的隔离级别设置成SERIALIZABLE,也就是串⾏化,那事务⼀下接⼀个的执⾏,全完放弃并发执⾏,那么效率也就会变的低,但是是最安全的。

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

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

相关文章

MySQL的索引与SQL优化策略

文章目录 存储引擎常见的存储引擎 索引索引结构BTree的优点索引分类索引语法explain执行计划索引的使用原则最左前缀法则范围查询索引列进行运算操作字符串不加引号模糊查询or连接的条件数据分布影响 覆盖索引前缀索引索引的设计原则 SQL优化insert优化主键优化order by优化gro…

途虎养车三闯IPO,如何突破亏损“魔咒”?

近日&#xff0c;汽车后市场的“资本宠儿”途虎养车更新招股书&#xff0c;再次闯关港股IPO。 途虎养车是一家中国线上线下一体化汽车服务平台。2013-2021年&#xff0c;途虎养车共进行16轮融资&#xff0c;融资总额超过90亿元。这是继2022年1月和8月先后两次递表失效后&#…

layui框架实战案例(20):常用条件判断和信息展示技巧(图片预览、动态表格、短信已读未读、链接分享、信息脱敏、内置框架页)

本文档是近期layui的汇总&#xff0c;部分内容可能会重复。 文章目录 前言一、上传图片预览1.HTML代码2.JQ渲染代码 二、动态表格数据返回条件判断1.动态表格返回列状态判断2.cols列数据事件操作3.删除信息4.短信已读未读状态处理5.confirm确认事件6.链接分享7.信息脱敏 三、内…

【分享】解压文件一直显示失败,如何处理?

想要解压压缩文件&#xff0c;却发现一直显示失败&#xff0c;有可能是以下几个原因引起的。 1、原压缩文件在下载或者发送过程中出现漏洞&#xff0c;导致文件数据不完整。 2、压缩文件感染病毒&#xff0c;或者杀毒软件等阻止解压缩操作。 3、源文件在压缩的过程中&#x…

参展第六届中国城市轨道交通智慧运维大会 | 图扑软件

2022&#xff08;第六届&#xff09;中国城市轨道交通智慧运维大会在西安顺利举行。此次大会由现代轨道交通网联合中国机械工程学会设备智能运维分会主办&#xff0c;西安市轨道交通集团有限公司运营分公司、轨道交通工程信息化国家重点实验室(中铁一院)协办。来自行业学会、地…

【vue.js】前端生成随机图片组件

文章目录 前言效果代码 前言 这是一个前端随机生成图片的组件&#xff0c;可以用作滑块验证组件的背景图。 效果 以下效果是结合滑块验证组件一起构建的。 代码 <template><img ref"random-image" /> </template> <script> export defau…

V2.4版本商超标签专用路由器

PICK_Router_V2.4 产品参数 产品型号 PICK_Router_V2.4 尺寸(mm) 21*14*4.3mm 工作温度 -10-70℃ 产品重量 465g 供电方式 DC12V or POE 工作频率 2.4G 通信速率 50-250kbps 通信方式 10/100Mbps有线网络&2.4G 通信半径 30m 支持标签数量 >10000…

ChatGPT其实并不想让开发人员做这5件事情,但却已经被玩坏了

前言 ChatGPT已经火爆了快半年了吧&#xff0c;紧接着国内也开始推出了各种仿制品&#xff0c;我甚至一度怀疑&#xff0c;如果人家没有推出ChatGPT&#xff0c;这些仿制品会不会出现。而很多人也嗨皮得不行&#xff0c;利用各种方法开始科学上网&#xff0c;用ChatGPT做各种觉…

PostMan笔记(四)Mock服务与API文档管理

1. Mock服务 1.1 为什么使用Mock服务 Postman的Mock服务是一种API模拟工具&#xff0c;可以用于模拟API的行为并返回虚拟的响应。它可以帮助开发人员在实际API实现之前测试和验证API设计&#xff0c;以及在客户端应用程序开发过程中进行测试和调试。 使用Postman的Mock服务可…

SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈(Feign、Gateway)

http客户端Feign &#xff08;一&#xff09;基于Feign远程调用 1、RestTemplate方式调用存在的问题 2、Feign的介绍 3、定义和使用Feign客户端 这个接口里面将来的封装的就是所有对userservice发起的远程调用 1、orderserivce的pom <!--feign客户端依赖--> <depe…

花生壳内网穿透步骤详解,感兴趣的小伙伴可以自己去尝试哦~

花生壳是什么&#xff1f; 花生壳是款具备内网穿透功能的软件。是通过云服务器快速与内网服务器建立连接&#xff0c;同时把内网端口映射到云端&#xff0c;实现各类基于域名的互联网应用服务。花生壳能够实现反向代理应用&#xff0c;支持TCP、HTTP、HTTPS协议&#xff0c;端…

数据结构基础day3

题目&#xff1a;119. 杨辉三角II 我的解法&#xff1a;先将杨辉三角存储起来&#xff0c;取出第rowIndex行 class Solution { public:vector<int> getRow(int rowIndex) {vector<vector<int>> ans(rowIndex1); //初始化rowIndex1行的杨辉三角for(int i0; …

贾其萃 : 笃行实践 筑梦扬帆 | 提升之路系列(二)

导读 为了发挥清华大学多学科优势&#xff0c;搭建跨学科交叉融合平台&#xff0c;创新跨学科交叉培养模式&#xff0c;培养具有大数据思维和应用创新的“π”型人才&#xff0c;由清华大学研究生院、清华大学大数据研究中心及相关院系共同设计组织的“清华大学大数据能力提升项…

如何开发一款用户体验优秀的语音交友app?

在数字时代&#xff0c;人们越来越依赖智能手机上的应用程序来与他人进行交流。其中&#xff0c;语音交友app成为了最受欢迎的应用之一。然而&#xff0c;开发一款成功的语音交友app需要深入了解用户需求与体验。本文将探讨如何开发一款用户体验优秀的语音交友app。 着眼于用户…

微信小程序uniapp基于Android的大学生社交论坛交流app系统

实现一个基于Android的社交APP小程序,一共3个身份&#xff0c;包括老师、学生和管理员&#xff0c;其中老师和学生在手机端注册登录&#xff0c;管理员在web端后台登录。学生和老师登录后可以查询通知新闻信息&#xff0c;收藏信息&#xff0c;查看好友推荐&#xff0c;论坛发帖…

短视频app开发:如何实现实时短视频录制功能

简介 在当今的移动互联网时代&#xff0c;短视频app已经成为了人们生活中不可或缺的一部分。短视频app的数量和用户量都在不断增加。如今&#xff0c;越来越多的人开始关注短视频app的开发&#xff0c;尤其是如何实现实时短视频录制功能。本文将分享如何开发短视频app并实现实…

【TS】1660- 4 个 TypeScript 5.1 Beta 版重要更新内容

TypeScript 5.1 在 5.0 发布后不久就发布了测试版&#xff0c;但测试版不代表最终正式版。 官方原文 Announcing TypeScript 5.1 Beta(https://devblogs.microsoft.com/typescript/announcing-typescript-5-1-beta/) 中提供了完整的更新内容&#xff0c;以下是我梳理了 4 个 T…

总结829

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;背完第5轮核心词&#xff0c;那些没掌握的还是没掌握&#xff0c;必须重点揪出来&#xff0c;单独…

QT QPainter坐标系统和坐标变换

一、坐标变换函数 QPainter 在窗口上绘图的默认坐标系统如图下图所示&#xff0c;这是绘图设备的物理坐标。为了绘图的方便&#xff0c;QPainter 提供了一些坐标变换的功能&#xff0c;通过平移、旋转等坐标变换&#xff0c;得到一个逻辑坐标系统&#xff0c;使用逻辑坐标系统…

021:Mapbox GL加载arcgis地图(影像瓦片图)

第020个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载arcgis地图(影像瓦片图)。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共80行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置…