关于MySQL的索引

article/2025/7/20 8:23:02

一、索引

1、索引概述

1.1、介绍

索引 index )是帮助 MySQL 高效获取数据的数据结构 ( 有序 ) 。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

1.2、特点

2、索引结构

2.1、概述

MySQL 的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种:
上述是 MySQL 中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持情况。
注意: 我们平常所说的索引,如果没有特别指明,都是指 B+ 树结构组织的索引。

2.2、B+Tree

B+Tree B-Tree 的变种,我们以一颗最大度数( max-degree )为 4 4 阶)的 b+tree 为例,来看一
下其结构示意图:
我们可以看到,两部分:
  • 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
  • 红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。
知识小贴士 : 树的度数指的是一个节点的子节点个数。

2.3、MySQL里的B+tree索引结构

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序。

2.4、Hash

MySQL 中除了支持 B+Tree 索引,还支持一种索引类型 ---Hash 索引。
2.4.1结构
哈希索引就是采用一定的 hash 算法,将键值换算成新的 hash 值,映射到对应的槽位上,然后存储在
hash 表中。
如果两个 ( 或多个 ) 键值,映射到一个相同的槽位上,他们就产生了 hash 冲突(也称为 hash 碰撞),可以通过链表来解决。
2.4.2特点
  1. Hash索引只能用于对等比较(=in),不支持范围查询(between>< ...
  2. 无法利用索引完成排序操作
  3. 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree
2.4.3存储引擎支持
MySQL 中,支持 hash 索引的是 Memory 存储引擎。 而 InnoDB 中具有自适应 hash 功能, hash 索引是InnoDB存储引擎根据 B+Tree 索引在指定条件下自动构建的。
思考题: 为什么InnoDB存储引擎选择使用B+tree索引结构?
  1. 相对于二叉树,层级更少,搜索效率高;
  2. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
  3. 相对Hash索引,B+tree支持范围匹配及排序操作;

3、索引分类

3.1、索引分类

MySQL 数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。

3.2、聚集索引&二级索引

而在在 InnoDB 存储引擎中,根据索引的存储形式,又可以分为以下两种:

聚集索引选取规则 :
  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索 引。
聚集索引和二级索引的具体结构如下:
  • 聚集索引的叶子节点下挂的是这一行的数据 。
  • 二级索引的叶子节点下挂的是该字段值对应的主键值。
接下来,我们来分析一下,当我们执行如下的 SQL 语句时,具体的查找过程是什么样子的。
具体过程如下 :
  1. 由于是根据name字段进行查询,所以先根据name='Arm'name字段的二级索引中进行匹配查找。但是在二级索引中只能查找到 Arm 对应的主键值 10
  2. 由于查询返回的数据是*,所以此时,还需要根据主键值10,到聚集索引中查找10对应的记录,最终找到10对应的行row
  3. 最终拿到这一行的数据,直接返回即可。
回表查询: 这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取
数据的方式,就称之为回表查询。

4、索引语法

  1. 创建索引 : 
    CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (
    index_col_name,... ) ;
  2. 查找索引 : 
    SHOW INDEX FROM table_name ;
  3. 删除索引 : 
    DROP INDEX index_name ON table_name ;

5、SQL性能分析

5.1、SQL执行频率

MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信
息。通过如下指令,可以查看当前数据库的 INSERT UPDATE DELETE SELECT 的访问频次
-- session 是查看当前会话 ;
-- global 是查询全局数据 ;
SHOW GLOBAL STATUS LIKE 'Com_______';

Com_delete:    删除次数
Com_insert:    插入次数
Com_select:    查询次数
Com_update:   更新次数

我们可以在当前数据库再执行几次查询操作,然后再次查看执行频次,看看 Com_select 参数会不会变化。

通过上述指令,我们可以查看到当前数据库到底是以查询为主,还是以增删改为主,从而为数据 库优化提供参考依据。 如果是以增删改为主,我们可以考虑不对其进行索引的优化。如果是以查询为主,那么就要考虑对数据库的索引进行优化了。
那么通过查询 SQL 的执行频次,我们就能够知道当前数据库到底是增删改为主,还是查询为主。 那假如说是以查询为主,我们又该如何定位针对于那些查询语句进行优化呢? 次数我们可以借助于慢查询日志。
接下来,我们就来介绍一下 MySQL 中的慢查询日志

5.2、慢查询日志

慢查询日志记录了所有执行时间超过指定参数( long_query_time ,单位:秒,默认 10 秒)的所有
SQL 语句的日志。
MySQL 的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_log

如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2
配置完毕之后,通过以下指令重新启动 MySQL 服务器进行测试,查看慢日志文件中记录的信息
/var/lib/mysql/localhost-slow.log
systemctl restart mysqld

然后,再次查看开关情况,慢查询日志就已经打开了。

测试:
  1. 执行如下SQL语句 : 
    select * from tb_user; -- 这条SQL执行效率比较高, 执行耗时 0.00sec
    select count(*) from tb_sku; -- 由于tb_sku表中, 预先存入了1000w的记录, count一次,耗时13.35sec
  2. 检查慢查询日志 : 最终我们发现,在慢查询日志中,只会记录执行时间超多我们预设时间(2s)的SQL,执行较快的SQL是不会记录的。

那这样,通过慢查询日志,就可以定位出执行效率比较低的SQL,从而有针对性的进行优化。

5.3、profile详情

show profiles 能够在做 SQL 优化时帮助我们了解时间都耗费到哪里去了。通过 have_profiling
参数,能够看到当前 MySQL 是否支持 profile 操作:
SELECT @@have_profiling ;

可以看到,当前 MySQL 是支持 profile 操作的,但是开关是关闭的。可以通过 set 语句在
session/global 级别开启 profiling
SET profiling = 1;
开关已经打开了,接下来,我们所执行的 SQL 语句,都会被 MySQL 记录,并记录执行时间消耗到哪儿去了。 我们直接执行如下的SQL 语句:
select * from tb_user;
select * from tb_user where id = 1;
select * from tb_user where name = '白起';
select count(*) from tb_sku;
执行一系列的业务 SQL 的操作,然后通过如下指令查看指令的执行耗时:
-- 查看每一条SQL的耗时基本情况
show profiles;
-- 查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;
-- 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;
查看每一条 SQL 的耗时情况 :
查看指定 SQL 各个阶段的耗时情况 :

5.4、explain

EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。
-- 直接在select语句之前加上关键字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件 ;

Explain 执行计划中各个字段的含义 :

6、索引使用

6.1、验证索引效率

在讲解索引的使用原则之前,先通过一个简单的案例,来验证一下索引,看看是否能够通过索引来提升数据查询性能。在演示的时候,我们还是使用之前准备的一张表 tb_sku , 在这张表中准备了 1000w的记录。
这张表中id 为主键,有主键索引,而其他字段是没有建立索引的。 我们先来查询其中的一条记录,看看里面的字段情况,执行如下SQL
select * from tb_sku where id = 1\G;

可以看到即使有 1000w 的数据 , 根据 id 进行数据查询 , 性能依然很快,因为主键 id 是有索引的。 那么接下来,我们再来根据 sn 字段进行查询,执行如下 SQL
SELECT * FROM tb_sku WHERE sn = '100000003145001';

我们可以看到根据 sn 字段进行查询,查询返回了一条数据,结果耗时 20.78sec ,就是因为 sn 没有索引,而造成查询效率很低。
那么我们可以针对于 sn 字段,建立一个索引,建立了索引之后,我们再次根据 sn 进行查询,再来看一下查询耗时情况。
创建索引:
create index idx_sku_sn on tb_sku(sn) ;

然后再次执行相同的 SQL 语句,再次查看 SQL 的耗时。
SELECT * FROM tb_sku WHERE sn = '100000003145001';

我们明显会看到, sn 字段建立了索引之后,查询性能大大提升。建立索引前后,查询耗时都不是一个数量级的。

6.2、最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将会部分失效( 后面的字段索引失效 )
tb_user 表为例,我们先来查看一下之前 tb_user 表所创建的索引。
tb_user 表中,有一个联合索引,这个联合索引涉及到三个字段,顺序分别为: profession
age status
对于最左前缀法则指的是,查询时,最左边的列,也就是 profession 必须存在,否则索引全部失效。而且中间不能跳过某一列,否则该列后面的字段索引将失效。 接下来,我们来演示几组案例,看一下
具体的执行计划:
explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';

explain select * from tb_user where profession = '软件工程' and age = 31;

explain select * from tb_user where profession = '软件工程';

以上的这三组测试中,我们发现只要联合索引最左边的字段 profession 存在,索引就会生效,只不
过索引的长度不同。 而且由以上三组测试,我们也可以推测出 profession 字段索引长度为 47 age
字段索引长度为 2 status 字段索引长度为 5
explain select * from tb_user where age = 31 and status = '0';

explain select * from tb_user where status = '0';

而通过上面的这两组测试,我们也可以看到索引并未生效,原因是因为不满足最左前缀法则,联合索引最左边的列profession不存在。

explain select * from tb_user where profession = '软件工程' and status = '0';

上述的 SQL 查询时,存在 profession 字段,最左边的列是存在的,索引满足最左前缀法则的基本条
件。但是查询时,跳过了 age 这个列,所以后面的列索引是不会使用的,也就是索引部分生效,所以索引的长度就是47
思考题: 

当执行SQL语句:
explain select * from tb_user where age = 31 and status = '0' and profession = '软件工程';
时,是否满足最左前缀法则,走不走上述的联合索引,索引长度?
可以看到,是完全满足最左前缀法则的,索引长度 54 ,联合索引是生效的。
注意 : 最左前缀法则中指的最左边的列,是指在查询时,联合索引的最左边的字段 ( 即是
第一个字段 ) 必须存在,与我们编写 SQL 时,条件编写的先后顺序无关。

6.3、范围查询

联合索引中,出现范围查询 (>,<) ,范围查询右侧的列索引失效。
explain select * from tb_user where profession = '软件工程' and age > 30 and status = '0';

当范围查询使用 > < 时,走联合索引了,但是索引的长度为 49 ,就说明范围查询右边的 status
段是没有走索引的。
所以,在业务允许的情况下,尽可能的使用类似于 >= <= 这类的范围查询,而避免使用 > < 。

6.4索引失效情况

6.4.1索引列运算

不要在索引列上进行运算操作, 索引将失效。

tb_user表中,除了前面介绍的联合索引之外,还有一个索引,是phone字段的单列索引。

A. 当根据phone字段进行等值匹配查询时, 索引生效。

explain select * from tb_user where phone = '17799990015';

B. 当根据 phone 字段进行函数运算操作之后,索引失效。
explain select * from tb_user where substring(phone,10,2) = '15';

6.4.2字符串不加引号
字符串类型字段使用时,不加引号,索引将失效。
如果字符串不加单引号,对于查询结果,没什么影响,但是数据库存在隐式类型转换,索引将失效。
6.4.3 模糊查询
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
接下来,我们来看一下这三条 SQL 语句的执行效果,查看一下其执行计划:
由于下面查询语句中,都是根据 profession 字段查询,符合最左前缀法则,联合索引是可以生效的,我们主要看一下,模糊查询时,% 加在关键字之前,和加在关键字之后的影响。
explain select * from tb_user where profession like '软件%';
explain select * from tb_user where profession like '%工程';
explain select * from tb_user where profession like '%工%';

经过上述的测试,我们发现, like 模糊查询中,在关键字后面加 %,索引可以生效。而如果在关键字前面加了%,索引将会失效。
6.4.4or连接条件
or 分割开的条件, 如果 or 前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
explain select * from tb_user where id = 10 or age = 23;
explain select * from tb_user where phone = '17799990017' or age = 23;

 由于age没有索引,所以即使idphone有索引,索引也会失效。所以需要针对于age也要建立索引。

然后,我们可以对 age 字段建立索引。
create index idx_user_age on tb_user(age);

 建立了索引之后,我们再次执行上述的SQL语句,看看前后执行计划的变化

 

 最终,我们发现,当or连接的条件,左右两侧字段都有索引时,索引才会生效。

 6.4.5数据分布影响

 如果MySQL评估使用索引比全表更慢,则不使用索引。

select * from tb_user where phone >= '17799990005';
select * from tb_user where phone >= '17799990015';

 

经过测试我们发现,相同的 SQL 语句,只是传入的字段值不同,最终的执行计划也完全不一样,这是为什么呢?
就是因为 MySQL 在查询时,会评估使用索引的效率与走全表扫描的效率,如果走全表扫描更快,则放弃索引,走全表扫描。 因为索引是用来索引少量数据的,如果通过索引查询返回大批量的数据,则还不如走全表扫描来的快,此时索引就会失效。
接下来,我们再来看看 is null is not null 操作是否走索引。
执行如下两条语句 :
explain select * from tb_user where profession is null;
explain select * from tb_user where profession is not null;

 接下来,我们做一个操作将profession字段值全部更新为null

然后,再次执行上述的两条SQL,查看SQL语句的执行计划。

最终我们看到,一模一样的 SQL 语句,先后执行了两次,结果查询计划是不一样的,为什么会出现这种
现象,这是和数据库的数据分布有关系。查询时 MySQL 会评估,走索引快,还是全表扫描快,如果全表
扫描更快,则放弃索引走全表扫描。 因此, is null is not null 是否走索引,得具体情况具体
分析,并不是固定的。

6.5SQL提示

目前tb_user表的数据情况如下

 索引情况如下:

 把上述的 idx_user_age, idx_email 这两个之前测试使用过的索引直接删除。

drop index idx_user_age on tb_user;
drop index idx_email on tb_user;
A. 执行 SQL : explain select * from tb_user where profession = ' 软件工程 ';

 

查询走了联合索引。 

B. 执行 SQL ,创建 profession 的单列索引:
create index idx_user_pro on tb_user(profession);

 C. 创建单列索引后,再次执行A中的SQL语句,查看执行计划,看看到底走哪个索引。

测试结果,我们可以看到, possible_keys idx_user_pro_age_sta,idx_user_pro 这两个索引都可能用到,最终MySQL选择了 idx_user_pro_age_sta 索引。这是MySQL自动选择的结果。
那么,我们能不能在查询的时候,自己来指定使用哪个索引呢? 答案是肯定的,此时就可以借助于MySQL的 SQL 提示来完成。 接下来,介绍一下 SQL 提示。
SQL提示,是优化数据库的一个重要手段,简单来说,就是在 SQL 语句中加入一些人为的提示来达到优化操作的目的。

  1. use index : 建议 MySQL 使用哪一个索引完成此次查询(仅仅是建议, mysql 内部还会再次进行评估)。
    explain select * from tb_user use index(idx_user_pro) where profession = '软件工程';

  2. ignore index : 忽略指定的索引。
    explain select * from tb_user ignore index(idx_user_pro) where profession = '软件工程';

  3. force index : 强制使用索引

    explain select * from tb_user force index(idx_user_pro) where profession = '软件工程';

 6.6覆盖索引

尽量使用覆盖索引,减少 select * 。 那么什么是覆盖索引呢? 覆盖索引是指 查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。

 接下来,我们来看一组SQL的执行计划,看看执行计划的差别,然后再来具体做一个解析

explain select id, profession from tb_user where profession = '软件工程' and age = 31 and status = '0' ;explain select id,profession,age, status from tb_user where profession = '软件工程' and age = 31 and status = '0' ;explain select id,profession,age, status, name from tb_user where profession = '软件工程' and age = 31 and status = '0' ;explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';

 上述这几条SQL的执行结果为:

从上述的执行计划我们可以看到,这四条 SQL 语句的执行计划前面所有的指标都是一样的,看不出来差异。但是此时,我们主要关注的是后面的Extra ,前面两天 SQL 的结果为 Using where; Using Index ; 而后面两条 SQL 的结果为 : Using index condition

因为,在 tb_user 表中有一个联合索引 idx_user_pro_age_sta ,该索引关联了三个字段profession、 age status ,而这个索引也是一个二级索引,所以叶子节点下面挂的是这一行的主键id 。 所以当我们查询返回的数据在 id profession age status 之中,则直接走二级索引直接返回数据了。 如果超出这个范围,就需要拿到主键id,再去扫描聚集索引,再获取额外的数据 了,这个过程就是回表。 而我们如果一直使用 select * 查询返回所有字段值,很容易就会造成回表 查询(除非是根据主键查询,此时只会扫描聚集索引)。
为了大家更清楚的理解,什么是覆盖索引,什么是回表查询,我们一起再来看下面的这组 SQL 的执行过程。
A. 表结构及索引示意图 :

 id是主键,是一个聚集索引。 name字段建立了普通索引,是一个二级索引(辅助索引)。

 B. 执行SQL : select * from tb_user where id = 2;

 根据id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。

C. 执行SQLselet id,name from tb_user where name = 'Arm';

虽然是根据 name 字段查询,查询二级索引,但是由于查询返回在字段为 id name ,在 name 的二级索引中,这两个值都是可以直接获取到的,因为覆盖索引,所以不需要回表查询,性能高。

 D. 执行SQLselet id,name,gender from tb_user where name = 'Arm';

 

由于在 name 的二级索引中,不包含 gender ,所以,需要两次索引扫描,也就是需要回表查询,性能相对较差一点。
思考题:
一张表 , 有四个字段 (id, username, password, status), 由于数据量大 , 需要对以下SQL 语句进行优化 , 该如何进行才是最优方案 :
select id,username,password from tb_user where username = 'itcast';

答案: 针对于 username, password建立联合索引, sql为:

create index idx_user_name_pass on tb_user(username,password);
这样可以避免上述的 SQL 语句,在查询的过程中,出现回表查询。

 6.7前缀索引

当字段类型为字符串( varchar text longtext 等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO , 影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

  1. 语法
    create index idx_xxxx on table_name(column(n)) ;
    示例 :
     
    tb_user 表的 email 字段,建立长度为5的前缀索引。
    create index idx_email_5 on tb_user(email(5));

     
  2. 前缀长度
     
    可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1 ,这是最好的索引选择性,性能是最好的。
     
    select count(distinct email) / count(*) from tb_user ;
    select count(distinct substring(email,1,5)) / count(*) from tb_user ;

    贴士: 求取不重复的值, 在字段前加上distinct关键字来去重

  3. 前缀索引的查询流程

     

 6.8单列索引与联合索引

单列索引:即一个索引只包含单个列。
 
联合索引:即一个索引包含了多个列。
我们先来看看 tb_user 表中目前的索引情况:
 

 在查询出来的索引中,既有单列索引,又有联合索引

接下来,我们来执行一条SQL语句,看看其执行计划:

通过上述执行计划我们可以看出来,在 and 连接的两个字段 phone name 上都是有单列索引的,但是最终mysql 只会选择一个索引,也就是说,只能走一个字段的索引,此时是会回表查询的。

紧接着,我们再来创建一个 phone name 字段的联合索引来查询一下执行计划。

create unique index idx_user_phone_name on tb_user(phone,name);

此时,查询时,就走了联合索引,而在联合索引中包含 phone name 的信息,在叶子节点下挂的是对应的主键id ,所以查询是无需回表查询的。

在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,而非单列索引。

 如果查询使用的是联合索引,具体的结构示意图如下:

 

 7索引设计原则

  1. 针对于数据量较大,且查询比较频繁的表建立索引。
     
  2. 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
     
  3. 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
     
  4. 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
     
  5. 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
     
  6. 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。

http://www.hkcw.cn/article/hWfIZvDyvg.shtml

相关文章

52岁局长涉性侵女子 职务信息被撤 案件引发广泛关注

今年4月,湖南省机场管理集团党委书记、董事长,湖南省机场管理局局长邱继兴,因涉嫌性侵一女子被警方刑拘一事引发广泛关注。6月2日,大皖新闻记者注意到,该集团已迎来新任党委书记、董事长,官网已撤下邱继兴职务信息,集团官方微信公众号中大量关于他的内容也已消失。邱继兴…

马斯克评论乌对俄无人机特种作战 无人机主宰未来战场

马斯克评论“乌对俄发动大规模无人机特种作战”时称,无人机正在成为现代战争的关键工具。他表示,无人机才是未来战场的主宰,而不是有人驾驶飞机。2025年6月1日,乌克兰国家安全局在社交媒体上宣布,当天对俄罗斯实施了特种作战行动,袭击了俄军的战略轰炸机。乌克兰总统泽连…

男子委托网友炒股8个月亏40万 盲目信任酿苦果

山东沂南的王某和李某都是某炒股群网友。王某听说李某具有丰富的炒股经验,便把自己的股票账户和密码交给李某代为炒股,并承诺把盈利的20%分给李某,而李某则表示如果亏了钱会转给王某。从2021年12月至2022年8月期间,王某委托李某炒股累计投入资金60万元,结果亏损40万元,王…

VMware(威睿)公司

本文来源 &#xff1a;腾讯元宝 VMware&#xff08;威睿&#xff09;是一家全球领先的虚拟化和云计算基础架构解决方案提供商&#xff0c;成立于1998年&#xff0c;总部位于美国加利福尼亚州帕洛阿尔托。以下是其关键信息&#xff1a; 1. ​​公司概况​​ ​​成立时间​​&…

西安一男子谎报火警被拘留 醉酒报复引发关注

5月22日凌晨1时57分,西安消防接到报警称一火锅店发生火灾。接警后,西安市消防救援支队西华门消防站立即出动3车15人赶赴现场处置。出警途中,消防员多次联系报警人核实情况,但报警人只提供了店主的电话号码,拒绝提供店铺的具体位置和火灾详情等关键信息。消防员抵达现场后,…

利雅得胜利调整合同以求C罗留下 提交引援计划吸引续约

北京时间6月2日,意大利知名转会专家罗马诺透露,利雅得胜利正计划提交引援方案以吸引C罗续约。俱乐部准备向C罗展示他们的转会规划,希望能借此与他达成新的续约协议。为了获得C罗的续约批准,利雅得胜利正在积极筹备一系列改变,希望他能签署新合同继续留在球队。夏季转会窗口…

武汉入境游同比增长45% 端午旅游热度攀升

端午假期结束,携程发布了2025年端午旅游报告。报告显示,在五一和暑假之间的端午小长假期间,国内多地酒店价格较五一有所下降,民俗体验、周边短途游和避暑游成为主要增长点。热门景区前十中近一半为水上乐园类景区,龙舟赛作为“水”上非遗活动吸引了大量游客。湖北入境游订…

Ai视频翻译神器来袭!pyVideoTrans一键搞定字幕与配音,免费开源

1.前言 各位小伙伴们&#xff0c;大家好呀&#xff01;欢迎关注 天夏Ai&#xff0c;全网同名&#xff0c;我们致力于为大家挖掘和分享各种 精品实用的人工智能&#xff08;Ai&#xff09;资源&#xff0c;包括但不限于**&#xff1a;Ai黑科技工具软件、Ai副业创业项目、Ai智能硬…

【文末送书】Python OpenCV从入门到精通

文章目录 &#x1f354;简介opencv&#x1f339;内容简介&#x1f6f8;编辑推荐&#x1f384;导读&#x1f33a;彩蛋 &#x1f354;简介opencv OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;提供了丰富的图像处理和…

探秘海螺 AI 视频与计算机视觉算法的奇妙融合

目录 开篇&#xff1a;数字浪潮下的视频新变革 蓝耘 Maas 平台与海螺 AI 视频&#xff1a;崭露头角的视频创作利器 图片生成视频&#xff1a;化静为动的魔法 文本生成视频&#xff1a;文字到画面的奇妙转换 注册与登录 计算机视觉算法&#xff1a;海螺 AI 视频的核心驱动力…

第一人称动作识别文献阅读——LaViLa:从大型语言模型中学习视频表征信息

目录 摘要 Abstract 1 引言 2 准备工作 3 LaViLa 3.1 NARRATOR 3.2 REPHRASER 3.3 双编码器训练 总结 摘要 本周阅读的论文题目是《Learning Video Representations from Large Language Models》&#xff08;《从大型语言模型中学习视频表征信息》&#xff09;。本文…

外网访问内网海康威视监控视频的方案:WebRTC + Coturn 搭建

外网访问内网海康威视监控视频的方案&#xff1a;WebRTC Coturn 需求背景 在仓库中有海康威视的监控摄像头&#xff0c;内网中是可以直接访问到监控摄像的画面&#xff0c;由于项目的需求&#xff0c;需要在外网中也能看到监控画面。 实现这个功能的意义在于远程操控设备的…

基于PyQt5的UI界面开发——图像与视频的加载与显示

介绍 这里我们的主要目标是实现一个基于PyQt5和OpenCV的图像浏览和视频播放应用。用户可以选择本地的图像或视频文件夹&#xff0c;进行图像自动播放和图像切换以及视频播放和调用摄像头等操作&#xff0c;并且支持图像保存功能。项目的核心设计包括文件路径选择、图像或视频的…

浙江3名高中生深夜被困深山 成功获救未受伤

5月31日端午节晚上,三名高中生因降雨失温被困在浙江台州的大雷山。救援人员接到通知后迅速展开搜救行动,最终找到三人并提供了保温毯和雨衣等物资。所幸没有人员伤亡。网络视频显示,当晚天空下着大雨,民警、消防人员及救援队在集结搜寻。大雷山位于浙江省台州市中西部,是永…

西藏那曲双湖县发生3.6级地震 震源深度10公里

据中国地震台网正式测定,6月2日12时32分在西藏那曲市双湖县发生3.6级地震,震源深度10公里,震中位于北纬33.63度,东经89.36度。震中5公里范围内平均海拔约5344米。根据中国地震台网速报目录,震中周边200公里内近5年来共发生了70次3级以上地震,其中最大一次是2021年3月30日…

太原一路虎车在酒吧门口横冲直撞 警方已介入调查

6月2日凌晨4时许,有网友发帖称山西省太原市发生了一起越野车冲撞事件。当天上午,太原警方表示已接到报警并正在调查。根据网友发布的视频,这起事件发生在太原市小店区一商家门口。视频中一辆路虎越野车在前进和倒退时有冲撞物品的行为,路人纷纷避让,有人试图拉开路虎车门。…

苏州一医院医生被停工 误操作引发患者投诉

近日,苏州市立医院东区发生了一起B超检查项目的误操作事件。5月30日,患者王女士因身体不适前往医院就诊,医生开具了腹部B超检查单。然而,在实际操作中,超声科医生却误将其操作成阴道B超。这一错误在王女士察觉后才被发现。她询问项目名称时,实习医生仅背对回应“看错了”…

舟山多个海岛游客“被困” 当地回应 天气影响航班调整

6月1日和6月2日,一些在舟山海岛的游客发帖称,由于没有航班离岛,自己被困在海岛上。这些发帖者包括东极岛、枸杞岛等海岛的游客。据网友发布的图片显示,6月1日,东极海运发布提示:因受海面风浪影响,船舶无法航行,当天庙子湖至沈家门9:20、10:00航班停航,已购买该时段船票…

广铁计划加开列车321列 应对返程高峰

6月2日,端午小长假最后一天,广铁迎来返程客流高峰,旅客纷纷踏上归途。当天预计发送旅客237.3万人次,较去年增长9.3%。整个假期期间,旅客运输总体平稳有序。为满足出行需求,广铁集团优化调整运力,通过加开图外列车、动车组重联、增加夜间高铁等方式提升运力。6月2日计划加…

热刺决定解雇波斯特科格鲁,新主帅人选曝光 弗兰克成热门接班人

北京时间6月1日,热刺决定解雇波斯特科格鲁。托马斯-弗兰克成为热刺新教练的接班人选之一,马尔科-席尔瓦也在考虑名单上。此前法国媒体报道称,托特纳姆热刺本周与托马斯-弗兰克进行了直接接触,双方讨论了夏季转会计划和一些转会目标。责任编辑:zhangxiaohua