当前位置: 首页 > news >正文

[MySQL]02 存储引擎与索引,锁机制,SQL优化

Mysql存储引擎

可插拔式存储引擎
索引是在存储引擎底层上实现的


inno DB

MySQL默认存储引擎: inno DB
高可靠性和高性能的存储引擎

DML操作遵循ACID模型
支持事务
行级锁,提高并发访问性能
支持外键 约束,保证数据完整性和可靠性


MySAM

MySAM是MySQL的早期引擎

特点:

不支持事务,不支持外键
支持表锁,不支持行锁
访问速度快


Memory

Memory引擎的表数据时存储在内存中的.
由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。

特点:

内存存放
hash索引(默认)>文件


索引

高效获取数据的数据结构

索引概述

优势
提高数据检索的效率,降低数据库的IO成本
索引列也是要占用空间的。
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗

劣势
索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。

索引分类

  1. 主键索引(Primary Key Index):

    • 基于表的主键列创建的索引
    • 主键值是唯一的,不能有重复
    • 主键索引通常也是聚集索引
  2. 唯一索引(Unique Index):

    • 基于一个或多个列创建的索引
    • 索引列的值必须是唯一的,不能有重复
    • 可以是聚集索引或二级索引
  3. 常规索引(Normal Index):

    • 基于一个或多个列创建的索引
    • 索引列的值可以重复
    • 通常是二级索引
  4. 全文索引(Full-text Index):

    • 针对文本类型的数据创建的索引
    • 支持全文搜索,可以快速查找包含指定词语的记录
    • 通常适用于新闻、论坛等包含大量文本内容的应用
  5. 聚集索引(Clustered Index):

    • 数据本身的物理存储顺序与索引顺序一致
    • 查询速度快,但修改数据时需要重新排序
    • 通常主键索引就是聚集索引
  6. 二级索引(Secondary Index):

    • 数据的物理存储顺序与索引顺序不一致
    • 查询速度相对较慢,但修改数据时开销小
    • 大多数索引都是二级索引

B+Tree索引

最常见的索引类型

这里补充一下BTree和B+Tree数据结构

BTree

  • 非叶子节点只存储键值和指向子节点的指针
  • 所有数据都存储在叶子节点中,叶子节点之间通过链表相连
  1. 数据组织:

    • BTree 将数据组织成有序的多叉树结构,每个节点可以包含多个键值对。
    • 每个节点的键值对都是有序的,左子树的所有键值小于该节点,右子树的所有键值大于该节点。
  2. 自平衡:

    • BTree 是自平衡的数据结构,通过节点的拆分和合并,可以保证树的高度不会过高,从而提高查找效率。
    • 在插入或删除数据时,BTree 会自动调整节点,保持整棵树的平衡。
  3. 多叉结构:

    • 与二叉树不同,BTree 的每个节点可以拥有多个子节点,通常称为 "m 阶" BTree。
    • 更多的子节点意味着更少的树高,提高了查找效率。
B+Tree

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

  • 每个节点包含多个键值和指向子节点的指针
  • 键值有序排列,左子树小于该节点,右子树大于该节点
  1. 节点结构:

    • B+Tree 的非叶子节点只包含键值和指向子节点的指针,不存储实际数据。
    • 所有的数据都存储在叶子节点中,叶子节点之间通过链表结构相连。
  2. 查找过程:

    • 从根节点开始查找,沿着键值进行搜索,直到找到叶子节点。
    • 在叶子节点中进行最终的数据查找和访问。
  3. 数据组织:

    • 所有的数据都存储在叶子节点中,按键值有序排列。
    • 叶子节点之间通过链表结构相连,便于顺序访问。
  4. 优点:

    • 查找效率高,因为非叶子节点只需要进行键值比较,不需要访问实际数据。
    • 支持范围查询,可以通过遍历叶子节点的链表高效地完成范围查找。
    • 插入和删除操作相对简单,不需要维护非叶子节点中的数据。

BTree 与B+Tree 对比

Hash索引

底层数据结构是hash表,只有精确匹配索引列的查询才有效,不支持范围查询

Hash

Hash索引特点
1.Hash索引只能用于对等比较(=,in),不支持范围查询(betweenbetween,>, <, ...)
2.无法利用索引完成排序操作
3.查询效率高,通常只需要一次检索就可以了,效率通常要高于B+tree索引

出现hash碰撞需要在链表中查找比对


R-tree空间索引

空间索引是MySAM引擎的一个特殊索引类型
主要是用于地理空间数据类型,通常使用较少


Full-text全文索引

倒立排序索引,快速匹配文档的方式.类似于Lucene,Solr,ES

索引使用规范

索引遵循最左前缀原则

最左前缀原则指的是,在使用联合索引时,MySQL 会一从最左边的索引列开始匹配查询条件。也就是说,索引列的顺序非常重要。

如果查询条件只包含索引的右边部分,MySQL 将无法使用索引,而是会进行全表扫描,效率非常低下。


范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效

在索引列上进行函数运算会使索引列失效


字符串加引号

在查询条件中使用字符串时,一定要加上单引号 ,可能会存在隐式类型转换


模糊查询

如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

  • 使用 LIKE 进行模糊查询时,索引的使用情况会有所不同:
    • 如果仅是尾部模糊匹配,如 name LIKE 'abc%',索引仍然可以生效。
    • 但如果是头部模糊匹配,如 name LIKE '%abc',索引就会失效,需要进行全表扫描。

or连接的条件

用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。


数据分布影响

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

is null 和 is not null 也是一样的


回表查询

使用select * 很容易出现回表查询影响程序性能

除非有联合索引包含这个表的所有字段

锁机制

updata表锁情况

在事务中,进行字段更新的时候如果没有加索引的话,被判断/更新的字段会把整张表锁住
影响并发效率

如果其中的字段有索引,那么只会变成行级锁


间隙锁

间隙锁像只有一半的查锁,就是查的时候给他上锁
查询一个范围,后面的未赋值的数据就加锁

REPEATABLE_READ(可重复读)给查的数据加上锁,在事务结束之前都不能修改,以此来解决不可重复读问题.

REPEATABLE_READ(可重复读)+间隙锁就能解决幻读问题了.
这样不就构造了一个查锁吗,查的数据被锁了不查的空数据也被锁了.


全局锁

介绍
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。


表级锁

介绍
表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。
对于表级锁,主要分为以下三类:

1.表锁
2.元数据锁( meta data lock,MDL)
3.意向锁


表锁

对于表锁,分为两类:

  1. 表共享读锁(read lock):

    • 语法: LOCK TABLES tbl_name READ [, tbl_name2 READ]
    • 当事务获得表的读锁时,允许其他事务也获得该表的读锁,但不允许获得写锁。
    • 读锁可以防止其他事务对该表进行写操作,但不能防止其他事务读取该表数据。
  2. 表独占写锁(write lock):

    • 语法: LOCK TABLES tbl_name WRITE [, tbl_name2 WRITE]
    • 当事务获得表的写锁时,该事务拥有对表的独占访问权,不允许其他事务获得该表的任何锁(读锁或写锁)。
    • 写锁可以防止其他事务对该表进行任何读写操作。

元数据锁( meta data lock,MDL)

MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。


意向锁

为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查。

1.意向共享锁( IS):由语句select ... lock in share mode添加.
2.意向排他锁(IX)︰由insert、update、delete、select ... for update添加。


行级锁


行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。

InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

1.行锁(Record Lock)∶锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。

2.间隙锁(Gap Lock)∶锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下
都支持。

3.临键锁(Next-Key Lock)︰行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

lnnoDB实现了以下两种类型的行锁:
1.共享锁(S)∶允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
2.排他锁(X)∶允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。

SQL优化

主键优化

满足业务需求的情况下,尽量降低主键的长度。
插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。
尽量不要使用UUID做主键或者是其他自然主键,如身份证号。
业务操作时,避免对主键的修改。


页分裂

  • 页分裂是指当 MySQL 在 InnoDB 存储引擎中插入新记录或更新现有记录时,由于记录大小超过了页的可用空间,就需要将页分裂成两个新的页。
  • 页分裂的过程如下:
    1. MySQL 试图在当前页插入新记录或更新现有记录。
    2. 由于记录大小超过了页的可用空间,无法直接插入或更新。
    3. MySQL 会将当前页分裂成两个新的页,并将记录插入到合适的页中。
    4. 页分裂会增加页的数量,从而增加 InnoDB 存储引擎的磁盘占用空间。
  • 页分裂的主要原因是记录的大小超过了页的可用空间。为了避免页分裂,可以适当调整记录的大小或者增加页的大小。

页合并

  • 页合并是指当 MySQL 在 InnoDB 存储引擎中删除记录后,如果相邻的页剩余空间足够容纳被删除的记录,则会将这些页合并成一个新的页。
  • 页合并的过程如下:
    1. MySQL 在删除记录后,检查相邻页是否有足够的空间容纳被删除的记录。
    2. 如果有足够的空间,则将这些页合并成一个新的页。
    3. 页合并会减少页的数量,从而减少 InnoDB 存储引擎的磁盘占用空间。
  • 页合并的主要目的是为了减少页的数量,从而提高数据访问效率。

order by 优化

ORDER BY 优化:
ORDER BY 是用于对查询结果进行排序的关键字,但它会增加查询的开销。
- 优化 ORDER BY 的几个关键点:
1. 利用索引: 如果查询条件中包含了可以用于排序的索引列,MySQL 可以直接利用索引进行排序,而无需进行额外的排序操作。
2. 避免全字段排序: 如果只需要返回部分字段,可以只对这些字段进行排序,而不是对全部字段进行排序。这样可以减少排序的开销。
3. LIMIT 优化: 如果只需要返回前 N 条记录,可以使用 LIMIT N 来限制返回的记录数,减少排序的开销。
4. 利用覆盖索引: 使用覆盖索引可以避免回表操作,减少 I/O 开销。
5. 优化 ORDER BY 表达式: 如果 ORDER BY 中的表达式过于复杂,可以考虑提前计算好结果,然后直接排序。


group by 优化

GROUP BY 优化:
GROUP BY 是用于对查询结果进行分组统计的关键字,也会增加查询的开销。
- 优化 GROUP BY 的几个关键点:
1. 利用索引: 如果查询条件中包含了可以用于分组的索引列,MySQL 可以直接利用索引进行分组,而无需进行额外的分组操作。
2. 避免全字段分组: 如果只需要返回部分字段,可以只对这些字段进行分组,而不是对全部字段进行分组。这样可以减少分组的开销。
3. LIMIT 优化: 如果只需要返回前 N 条分组结果,可以使用 LIMIT N 来限制返回的记录数,减少分组的开销。
4. 利用覆盖索引: 使用覆盖索引可以避免回表操作,减少 I/O 开销。
5. 预先计算聚合函数: 如果查询中使用了聚合函数,可以考虑先计算好结果,然后再进行分组。这样可以减少分组的开销。


limit优化

一个常见又非常头疼的问题就是limit 2000000,10,此时需要MySQL排序前2000010记录,仅仅返回2000000 - 2000的记录,其他记录丢弃,查询排序的代价非常大。

优化思路:一般分页查询时,通过创建覆盖索引能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。

  1. 创建一个覆盖索引,其索引列包含了查询所需的所有列。
  2. 在查询语句中,使用子查询的方式先查询出需要的记录的 ID。
  3. 然后再根据 ID 从原表中查询出完整的记录。
  • 这样做的好处是:
    • 索引查询速度快,不需要全表扫描。
    • 只需要查询必要的记录,不会浪费资源查询无用的记录。

explain select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a where t.id = a.id;

cont优化

explain select count(*) from tb_user ;
MyISAM引擎把一个表的总行数存在了磁盘上,因此执行coun的时候会直接返回这个数,效率很高;InnoDB引擎就麻烦了,它执行count的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。

优化思路:自己计数。

count的几种用法count(主键)
InnoDB引擎会遍历整张表,把每一行的主键id 值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null)。

count(字段)
没有not null约束:lnnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加。

有not null约束: InnoDB引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。


count ( 1)
InnoDB引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加。


count (*)
lnnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。

大批量插入数据优化

如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下:

#客户端连接服务端时,加上参数--local-infile
mysql --local-infile -u root -p#设置全局参数local_infile为1,开启从本地加载文件导入数据的开关set global 
local_infile = 1;#执行load指令将准备好的数据,加载到表结构中
load data local infile '/root/sql1.log' into table 'tb_user’fields terminated by ',' lines terminated by '\n';

主键顺序插入的性能要高于乱序插入

聚集索引下挂的是主键


目录

Mysql存储引擎

inno DB

MySAM

Memory

索引

索引概述

索引分类

B+Tree索引

BTree

B+Tree

BTree 与B+Tree 对比

Hash索引

Hash

R-tree空间索引

Full-text全文索引

索引使用规范

索引遵循最左前缀原则

范围查询

字符串加引号

模糊查询

or连接的条件

数据分布影响

回表查询

锁机制

updata表锁情况

间隙锁

全局锁

表级锁

表锁

元数据锁( meta data lock,MDL)

意向锁

行级锁

SQL优化

主键优化

页分裂

页合并

order by 优化

group by 优化

limit优化

cont优化

大批量插入数据优化

分区表

复习

为什么选择B+Tree作为索引结构

sql优化问题


分区表

  1. 分区表的定义:

    • 分区表是将一张逻辑上的大表,根据某种规则(如时间、地理位置等)划分成多个物理上独立的小表。每个小表称为一个分区。
  2. 分区类型:

    • MySQL 支持多种分区类型,包括 RANGE 分区、LIST 分区、HASH 分区、KEY 分区等。
  3. 分区的优点:

    • 提高查询效率: 只需扫描对应的分区,而不是全表扫描,大幅提高查询速度。
    • 改善备份和恢复: 可以单独对某个分区进行备份和恢复,效率更高。
    • 简化数据管理: 可以轻松地删除或归档旧的数据分区。
    • 提高可用性: 可以针对某个分区进行维护操作,而不影响其他分区的使用。

查询的时候

  1. 利用分区字段进行查询:

    • 如果查询语句中包含分区字段的条件,数据库会自动识别并只扫描相关的分区,而不是全表扫描。
    • 例如,对于按 id 分区的表,查询 WHERE id BETWEEN 1000 AND 2000 时,数据库会只扫描 p1 分区。
    • 这种情况下,查询语句不需要做任何修改,数据库会自动优化查询计划。
  2. 不利用分区字段进行查询:

    • 如果查询语句中没有包含分区字段的条件,数据库无法利用分区信息,只能进行全表扫描。
    • 例如,对于按 id 分区的表,查询 WHERE username = 'itcast' 时,数据库会扫描所有分区。
    • 这种情况下,可以考虑修改查询语句,添加分区字段的条件,以便利用分区的优势。

复习

为什么选择B+Tree作为索引结构

简要版:

B+Tree 叶子节点非常适合按照索引进行顺序遍历.
叶子节点之间又是通过指针连接特殊的数据结构使得查询时间复杂度为log(n).
B+Tree 的非叶子节点只存储索引信息非常节省空间.

  • 由于 B+Tree 的叶子节点是通过指针连接的链表结构,非常适合范围查找操作。在叶子节点按照索引顺序遍历,可以快速找到所有满足条件的数据。
  • B+Tree 的所有数据都存储在叶子节点上,叶子节点之间又是通过指针连接的, 且B+Tree 的高度随着数据量的增加而缓慢增加,即使数据量很大,也只需要 2-4 次磁盘 I/O 就可以找到目标数据。这种 log(n) 查找复杂度非常高效。
  • B+Tree 的非叶子节点只存储索引信息,不存储实际数据,这大大减少了索引占用的存储空间,同时也提高了缓存命中率。

sql优化问题


一张表,有四个字段(id, username, password, status),
由于数据量大,需要对以下SQL语句进行优化,该如何进行才是最优方案:
select id,username,password from tb user where username ='itcast';

  1. 添加索引:

    • 对 username 字段建立索引,可以大幅提高查询效率。
    • 索引创建语句如下:

      sql

      复制
      CREATE INDEX idx_user_username ON tb_user (username);
      
  2. 使用覆盖索引:

    • 由于查询只需要返回 idusername 和 password 三个字段,可以利用覆盖索引来避免回表操作,进一步提高查询效率。
    • 修改索引创建语句如下:

      sql

      复制
      CREATE INDEX idx_user_username_password ON tb_user (username, password, id);
      
  3. 优化 SQL 语句:

    • 可以考虑使用 EXPLAIN 命令查看查询计划,进一步优化 SQL 语句。
    • 例如,可以尝试使用 SELECT username, password FROM tb_user WHERE username = 'itcast' 来利用覆盖索引。
  4. 优化数据库配置:

    • 根据实际情况,可以适当调整数据库的缓存配置,如 innodb_buffer_pool_sizequery_cache_size 等,以提高查询性能。
  5. 分区表:

    • 如果数据量非常大,可以考虑将表进行分区,按照 username 字段进行分区。这样可以减少扫描的数据量,提高查询效率。
  6. 读写分离:

    • 如果业务场景允许,可以将读写操作分离,使用主从复制架构。这样可以将查询请求分散到从库上,减轻主库的压力,提高整体的系统吞吐量。


 哈,谢谢各位同志的阅读,然后呢如果觉得本文对您有所帮助的话,还给个免费的赞捏
Thanks♪(・ω・)ノ

相关文章:

[MySQL]02 存储引擎与索引,锁机制,SQL优化

Mysql存储引擎 可插拔式存储引擎 索引是在存储引擎底层上实现的 inno DB MySQL默认存储引擎: inno DB高可靠性和高性能的存储引擎 DML操作遵循ACID模型支持事务行级锁,提高并发访问性能支持外键 约束,保证数据完整性和可靠性 MySAM MySAM是MySQL的早期引擎 特点: 不支持事…...

ld,GNU 链接器介绍以及命令行参数详解

ld&#xff0c;GNU 链接器介绍以及命令行参数详解 当我们使用GCC编译源代码生成可执行程序&#xff0c;经过预处理、汇编、编译、链接四个阶段。 链接器&#xff08;Linker&#xff09;将多个目标文件和库文件链接起来&#xff0c;链接器还解决目标文件之间的符号引用&#xff…...

[web]-反序列化-base64

看到源码 <?php error_reporting(0); class A {public $contents "hello ctfer";function __toString(){if ((preg_match(/^[a-z]/i,$this->contents))) {system("echo $this->contents");return 111;}else{return "...";}} }functi…...

【医学影像】RK3588+FPGA:满足远程诊疗系统8K音视频编解码及高效传输需求

医学影像 提供基于Intel平台、NXP平台、Rockchip平台的核心板、Mini-ITX主板、PICO-ITX主板以及工业整机等计算机硬件。产品板载内存&#xff0c;集成超高清编码/解码视频引擎&#xff0c;具有出色的数据处理能力和图形处理能力&#xff0c;功能高集成&#xff0c;可应用于超声…...

昇思25天学习打卡营第16天|基于MindSpore通过GPT实现情感分类

文章目录 昇思MindSpore应用实践1、基于MindSpore通过GPT实现情感分类GPT 模型&#xff08;Generative Pre-Training&#xff09;简介imdb影评数据集情感分类 2、Tokenizer导入预训练好的GPT3、基于预训练的GPT微调实现情感分类 Reference 昇思MindSpore应用实践 本系列文章主…...

服务器借助笔记本热点WIFI上网

一、同一局域网环境 1、当前环境&#xff0c;已有交换机组网环境&#xff0c;服务器已配置IP信息。 设备ip服务器125.10.100.12交换机125.10.100.0/24笔记本125.10.100.39 2、拓扑图 #mermaid-svg-D4moqMym9i0eeRBm {font-family:"trebuchet ms",verdana,arial,sa…...

开发实战中Git的常用操作

Git基础操作 1.初始化仓库 git init解释&#xff1a;在当前目录中初始化一个新的Git仓库。 2.克隆远程仓库 git clone <repository-url>解释&#xff1a;从远程仓库克隆一个完整的Git仓库到本地。 3.检查当前状态 git status解释&#xff1a;查看当前工作目录的状态…...

python调用chrome浏览器自动化如何选择元素

功能描述&#xff1a;在对话框输入文字&#xff0c;并发送。 注意&#xff1a; # 定位到多行文本输入框并输入内容。在selenium 4版本中&#xff0c;元素定位需要填写父元素和子元素名。 textarea driver.find_element(By.CSS_SELECTOR,textarea.el-textarea__inner) from …...

深入理解JS中的排序

在JavaScript开发中,排序是一项基础而重要的操作。本文将探讨JavaScript中几种常见的排序算法,包括它们的原理、实现方式以及适用场景。 1、冒泡排序 1.1、原理 通过比较相邻两个数的大小,交换位置排序:如果后一个数比前一个数小,则交换两个数的位置,重复这个过程,直…...

Kafka之存储设计

文章目录 1. 分区和副本的存储结构1. 分区和副本的分布2. 存储目录结构3. 文件描述 2. 相关配置3. 数据文件类型4. 数据定位原理LogSegment 类UnifiedLog 类 5. 副本数据同步HW水位线LEO末端偏移量HW更新原理 6. 数据清除 1. 分区和副本的存储结构 在一个多 broker 的 Kafka 集…...

Python面试整理-Python中的函数定义和调用

在Python中,函数是一种封装代码的方式,使得代码模块化和复用性更强。定义和调用函数是Python编程中的基本技能。以下是关于如何在Python中定义和调用函数的详细介绍: 函数定义 函数在Python中使用def关键字进行定义。函数体开始前,通常有一个可选的文档字符串(docstring)…...

HTTP协议、Wireshark抓包工具、json解析、天气爬虫

HTTP超文本传输协议 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff1a; 全称超文本传输协议&#xff0c;是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP 协议的重要特点&#xff1a; 一发一收…...

electron项目中实现视频下载保存到本地

第一种方式&#xff1a;用户自定义选择下载地址位置 渲染进程 // 渲染进程// 引入 import { ipcRenderer } from "electron";// 列表行数据下载视频操作&#xff0c;diffVideoUrl 是视频请求地址 handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message…...

基于chrome插件的企业应用

一、chrome插件技术介绍 1、chrome插件组件介绍 名称 职责 访问权限 DOM访问情况 popup 弹窗页面。即打开形式是通过点击在浏览器右上方的icon&#xff0c;一个弹窗的形式。 注: 展示维度 browser_action:所有页面 page_action:指定页面 可访问绝大部分api 不可以 bac…...

unittest框架和pytest框架区别及示例

unittest框架和pytest框架区别及示例 类型unittest框架pytest框架unittest框架示例pytest框架示例安装python内置的一个单元测试框架,标准库&#xff0c;不需要安装第三方单元测试库&#xff0c;需要安装使用时直接引用 import unittest安装命令&#xff1a;pip3 install pyte…...

IDEA性能优化方法解决卡顿

文章目录 前言一、可以采取以下措施&#xff1a;二、VM Options的参数解释1. 内存设置2. 性能调优3. GC&#xff08;垃圾回收&#xff09;调优4. 调试和诊断5. 其它设置6.设置 VM Options 的步骤&#xff1a; 总结 前言 我们在使用 IntelliJ IDEA的时候有时候会觉得卡顿&#x…...

Mysql集合转多行

mysql 集合转多行 SELECT substring_index(substring_index(t1.group_ids, ,, n), ,, -1) AS group_id FROM (select 908,909 as group_ids ) t1, (SELECT rownum : rownum 1 AS n FROM ( SELECT rownum : 0 ) r, orders ) t2 WHERE n < ( LENGTH( t1.group_ids ) - LENGT…...

MFC:只允许产生一个应用程序实例的具体实现

在MFC&#xff08;Microsoft Foundation Class&#xff09;应用程序中&#xff0c;如果你想限制只允许产生一个应用程序实例&#xff0c;通常会使用互斥体&#xff08;Mutex&#xff09;来实现。这可以确保如果用户尝试启动第二个实例时&#xff0c;它会被阻止或将焦点返回到已…...

深入理解TCP/IP协议中的三次握手

&#x1f44d; 个人网站&#xff1a;【洛秋资源小站】 深入理解TCP/IP协议中的三次握手 在计算机网络中&#xff0c;TCP/IP协议是通信的基石。理解TCP/IP协议中的三次握手是掌握网络通信的关键步骤之一。本文将详细解释TCP/IP协议中的三次握手过程&#xff0c;探讨其工作原理&…...

【React】事件绑定、React组件、useState、基础样式

React 教程 目录 事件绑定 1.1. 基础实现 1.2. 使用事件参数 1.3. 传递自定义参数 1.4. 同时传递事件对象和自定义参数 React 组件 2.1. 组件是什么 2.2. 组件基础使用 useState&#xff1a;状态管理 3.1. 基础使用 3.2. 状态的修改规则 3.3. 修改对象状态 基础样式 4.1. 行…...

x264、x265、libaom 编码对比实验

介绍 x264 是一个开源的高性能 H.264/MPEG-4 AVC 编码器,它以其优秀的压缩比和广泛的适用性而闻名。x265 是一种用于将视频流编码成 H.265/MPEG-H HEVC 压缩格式的免费软件库和应用程序,以其下一代压缩能力和卓越的质量而闻名 。作为 x264 的继任者,x265 支持 HEVC 的 Main、…...

c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令

配置FTP服务 一.前言 博主的环境是阿里云服务器&#xff0c;操作系统版本为 ubuntu20.04,一下所有操作都基于以上环境下进行的操作&#xff0c;同时为了简化操作我将开放同一个云服务器的不同端口&#xff0c;让它同时充当服务端和客户端&#xff0c;大家如果想测试效果更好且…...

Sphinx 安装相关指令解释

安装指令 pip3 install sphinx-autobuildpip3 install sphinx_rtd_themepip3 install sphinx_markdown_tablepip3 install sphinx_markdown_tables pip3 install sphinx-autobuild 功能&#xff1a;安装 sphinx-autobuild 包。作用&#xff1a;sphinx-autobuild 是一个工具&am…...

npm下载包-更改默认缓存目录

npm&#xff08;Node Package Manager&#xff09;的缓存目录是npm用于存储已下载包的本地位置&#xff0c;以便在后续安装相同包时能够快速复用&#xff0c;从而节省时间和带宽。npm缓存目录的具体位置会根据操作系统的不同而有所差异。 Windows系统 在Windows系统中&#x…...

PWM再理解(1)

前言 昨天过于劳累&#xff0c;十点睡觉&#xff0c;本来想梳理一下PWM&#xff0c;今天补上。 PWM内涵 PWM全称&#xff1a;Pulse Width Modulation&#xff0c;也就是脉宽调制的意思&#xff0c;字面意思理解就是对脉冲的宽度进行改变。准确就是通过数字输出对模拟电路进行…...

CSPVD 智慧工地安全帽安全背心检测开发包

CSPVD SDK适用于为各种智慧工地应用增加安全防护穿戴合规的检测能力&#xff0c;能够有效检测未戴安全帽和未穿 安全背心的人员&#xff0c;提供Web API和原生API。官方下载&#xff1a;CSPVD工地安全防护检测 1、目录组织 CSPVD开发包的目录组织说明如下&#xff1a; xlpr_…...

给常用Docker命令起别名,提高效率

在日常的开发和运维工作中&#xff0c;Docker是一款非常常用的工具。为了提高工作效率&#xff0c;我们可以为一些常用的Docker命令设置别名&#xff0c;这样可以更快速地执行这些命令。以下是如何给常用Docker命令起别名的详细步骤。 修改/root/.bashrc文件 首先&#xff0c…...

基于深度学习的草莓成熟度实时检测系统(UI界面+YOLOv8/v7/v6/v5模型+完整代码与数据集)

1. 引言 在农业领域&#xff0c;草莓的成熟度检测是保证果实品质的重要环节。传统的方法依赖于人工经验&#xff0c;不仅耗时费力&#xff0c;还容易出错。本文介绍如何使用YOLO&#xff08;You Only Look Once&#xff09;系列模型&#xff08;YOLOv8/v7/v6/v5&#xff09;构…...

【devops】ttyd 一个web版本的shell工具 | web版本shell工具 | web shell

一、什么是 TTYD ttyd是在web端一个简单的服务器命令行工具 类似我们在云厂商上直接ssh链接我们的服务器输入指令一样 二、安装ttyd 1、macOS Install with Homebrew: brew install ttydInstall with MacPorts: sudo port install ttyd 2、linux Binary version (recommend…...

Windows环境Apache配置解析PHP,以及配置虚拟主机详解

1. 安装 Apache 和 PHP 确保你已经安装了 Apache Web 服务器和 PHP。你可以从官方网站下载它们的 Windows 版本&#xff1a; Apache HTTP ServerPHP 2. 配置 Apache 配置 httpd.conf 文件 找到你的 Apache 安装目录下的 conf 文件夹中的 httpd.conf 文件&#xff0c;使用文…...

Redis高级篇—分布式缓存

目录 Redis持久化 RDB持久化 AOF持久化 RDB与AOF对比 Redis主从 全量同步 增量同步 Redis哨兵 RedisTemplate集成哨兵实现 Redis分片集群 散列插槽 集群伸缩 故障转移 自动故障转移 手动故障转移 RedisTemplate访问分片集群 Redis持久化 RDB持久化 RDB全称Re…...

c++端的类,作为组件在qml端使用

qml使用c端的类&#xff0c;作为组件在qml端使用 这个类必须继承QObject 这个类必须继承QObject #ifndef COLLISIONALARM_H #define COLLISIONALARM_H#include <QObject>class CollisionAlarm : public QObject {Q_OBJECT//这个宏就叫做反射机制&#xff0c;让qml端直接…...

Android 14 适配之 - 全屏 intent 通知

全屏 intent 通知 在 Android 11&#xff08;API 级别 30&#xff09;中&#xff0c;任何应用都可以在手机处于锁定状态时使用 Notification.Builder.setFullScreenIntent 发送全屏 intent。在 AndroidManifest 中声明 USE_FULL_SCREEN_INTENT 权限即可&#xff1b; 全屏 int…...

如何在 Vue 和 JavaScript 中截取视频任意帧图片

大家好&#xff01;今天我们来聊聊如何在 Vue 和 JavaScript 中截取视频的任意一帧图片。这个功能在很多场景下都非常有用&#xff0c;比如视频编辑、视频预览等。本文将带你一步步实现这个功能&#xff0c;并且会提供详细的代码示例。 准备工作 首先&#xff0c;我们需要一个…...

代码随想录学习 day54 图论 Bellman_ford 队列优化算法(又名SPFA) 学习

Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09; 卡码网&#xff1a;94. 城市间货物运输 I 题目描述 某国为促进城市间经济交流&#xff0c;决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市&#xff0c;通过道路网络连接&#xff0c;网络中的道路仅允许从…...

递归遍历树结构,前端传入一整颗树,后端处理这个树,包括生成树的id和pid等信息,

递归逻辑 递归遍历树结构&#xff0c;将树结构转换list集合 并添加到 flowStepTree 集合 // 递归遍历树结构&#xff0c;将树结构转换list集合 并添加到 flowStepTree 集合private static void settingTree(ProductFlowStepVO node, Long parentId, String ancestors, List<…...

Nginx详解(超级详细)

目录 Nginx简介 1. 为什么使用Nginx 2. 安装Nginx Nginx的核心功能 1. Nginx反向代理功能 2. Nginx的负载均衡 3 Nginx动静分离 Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协…...

postman使用旧版本报错version mismatch detected

卸载 postman又重装了别的版本&#xff0c;打开后遇到了这个报错&#xff0c;解决办法如下&#xff1a; 删除缓存文件 C:\Users\Administrator\AppData\Roaming\Postman 下载PostMan 提取码&#xff1a;6k51...

探索数据的隐藏维度:使用Scikit-Learn进行特征交互性预测

探索数据的隐藏维度&#xff1a;使用Scikit-Learn进行特征交互性预测 在机器学习中&#xff0c;特征交互性是指不同特征之间可能存在的复杂关系&#xff0c;这些关系对预测结果有着重要影响。Scikit-Learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中广受欢迎…...

首个WebAgent在线评测框架和流程数据管理平台来了,GPT-4、Qwen登顶闭源和开源榜首!

在当今科技迅速发展的时代&#xff0c;大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;正以前所未有的速度改变着我们与数字世界的互动方式。基于LLM的智能代理&#xff08;LLM Agent&#xff09;&#xff0c;从简单的信息搜索到复杂的网页操作&…...

UE TSharedPtr

文章目录 概述TSharedPtrTSharedPtr包含2部分 构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;移动构造构造拷贝构造移动构造 小结 概述 之前写过一篇c的智能指针的&#xff0c;这篇写下ue的。本质上来说是差不多的&#xff0c;可以简单看看。 TSharedPtr 如下图&…...

基于X86+FPGA+AI的远程医疗系统,支持12/13代 Intel Core处理器

工控主板&#xff1a;支持12/13代 Intel Core处理器&#xff0c;适用于远程医疗系统 顺应数字化、网络化、智能化发展趋势&#xff0c;国内医疗产业改革正在积极推进&#xff0c;远程医疗、智慧医疗等新模式新业态创新发展和应用&#xff0c;市场空间不断扩大&#xff0c;而基…...

微信小程序开发入门指南

文章目录 一、微信小程序简介二、微信小程序开发准备三、微信小程序开发框架四、微信小程序开发实例六、微信小程序开发进阶6.1 组件化开发6.2 API调用6.3 云开发 七、微信小程序开发注意事项7.1 遵守规范7.2 注意性能7.3 保护用户隐私 八、总结 大家好&#xff0c;今天将为大家…...

一个非常好的美图展示网站整站打包源码,集成了wordpress和开源版ripro主题,可以完美运营。

一个非常好的美图展示网站整站打包源码&#xff0c;集成了wordpress和开源版ripro主题&#xff0c;可以完美运营。 自带了5个多g的美图资源&#xff0c;让网站内容看起来非常大气丰富&#xff0c;可以快速投入运营。 这个代码包&#xff0c;原网站已经稳定运营多年&#xff0…...

MySQL:mysql的数据类型

MySQL 作为一个流行的关系型数据库管理系统&#xff0c;支持多种数据类型以满足不同的数据处理和存储需求。正确理解和使用这些数据类型对于提高数据库性能、确保数据完整性和准确性至关重要。 MySQL 数据类型 数据类型定义了列中可以存储什么数据以及该数据怎样存储的规则。…...

IPython魔法命令的深入应用

目录 IPython魔法命令的深入应用 一、魔法命令基础 1. 魔法命令的分类 2. 基本使用 二、高级应用技巧 1. 数据交互与处理 2. 交互式编程与调试 三、魔法命令的进阶操作 1. 自定义魔法命令 2. 利用魔法命令优化工作流程 四、总结与展望 IPython魔法命令的深入应用 IP…...

Yum包下载

1. 起因 内网有一台服务器需要升级php版本,维护的同学又不想二进制安装.服务器只有一个光盘的yum仓库 2. 解决方法 解决思路如下: 外网找一台机器配置php8.3.8的仓库外网服务器下载软件集并打包内网服务器上传并解压实现升级 2.1 下载php8.3.8仓库 配置php仓库 rootcent…...

数据结构代码

文章目录 线性表的插入线性表的删除单链表的建立栈的顺序存储队列的顺序存储串的顺序存储树的存储二叉树遍历前序遍历中序遍历后序遍历 二分法插入排序利用普里姆算法构造最小生成树 线性表的插入 #a: 列表&#xff0c;pos: 要插入的位置&#xff0c;key: 要插入的数据&#x…...

环信IM x 亚马逊云科技,助力出海企业实现可靠通讯服务

随着全球化进程的加速&#xff0c;越来越多的企业选择出海&#xff0c;拓展国际市场。然而&#xff0c;面对不同国家和地区的用户&#xff0c;企业在即时通讯方面遇到了诸多挑战。为了帮助企业克服这些困难&#xff0c;环信IM与亚马逊云科技强强联手&#xff0c;共同推出了一套…...

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图(二D)

R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图&#xff08;二D&#xff09; 散点图示例解析效果 饼图示例解析效果 折线图示例解析效果 柱状图示例解析效果 箱线图示例解析效果 直方图示例解析效果 等高线图使用filled.contour函数示例…...