MySQL-进阶

存储引擎

MySQL体系结构

  • 连接层:
    • 最上层是一些客户端和连接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
  • 服务层:
    • 第二层架构主要完成大多数的核心服务功能,如SQL接口,经完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现。如 过程、函数等。
  • 引擎层:
    • 存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能,这样我们可以感觉自己的需要,来选去合适的存储引擎。
  • 存储层:
    • 主要是将数据存储在文件系统之上,并完成与存储引擎的交互。

存储引擎简介

存储引擎就是存储数据、建立索引、更新、查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所有存储引擎又称为表类型。

-- -------------------------------------------------进阶
-- 查询创建表语句
show create table dept;
-- 查询支持的存储引擎
show engines ;
-- 创建一个my_MyISAMy表,用MyISAM引擎
create table my_MyISAM(id   int,name varchar(10)
)engine=MyISAM;

存储引擎特点

  • InnoDB
    • 介绍
      • InnoDB是一种兼顾可靠性和高性能的通用存储引擎,在MySQL5.5之后,InnoDB是默认的MySQL存储引擎。
    • 特点
      • DML操作遵循ACID模型,支持事务;
      • 行级锁,提高并发访问性能
      • 支持外键约束,保证数据的完整性和正确性
    • 文件
      • xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文还能,存储该表的表结构、数据和索引
      • 参数是:innodb_file_per_table
  • MyISAM
    • 介绍
      • MyISAM是MySQL早期的默认存储引擎。
    • 特点
      • 不支持事务,不支持外键
      • 支持表锁,不支持行锁
      • 访问速度快
    • 文件
      • xxx.sdi:存储表结构信息
      • xxx.MYD:存储数据
      • xxx.MYI:存储索引
  • Memory
    • 介绍:
      • Memory引擎的表数据是存储在内存中,由于受到硬件的问题或断电问题的影响,只能做为临时表或缓存使用
    • 特点:
      • 内存存放
      • hash索引(默认)
    • 文件:
      • xxx.sdi:存储表结构信息

存储引擎选择

在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组 合。

  • lnnoDB:是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致 性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
  • MylISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那 么选择这个存储引擎是非常合适的。
  • MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表 无法缓存在内存中,而且无法保障数据的安全性。

小结

索引

介绍

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

优缺点

优势

  • 提高数据检索的效率,降低数据库的I0成本
  • 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消 耗。

劣势

  • 索引列也是要占用空间的。
  • 索引大大提高了查询效率,同时却也降低更新表的速度,如对表进 行INSERT、UPDATE、DELETE时,效率降低。
索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:

索引结构描述
B+Tree索引最常见的索引类型,大部分引擎都支持B+树索引
Hash索引底层数据结构是用哈希表实现的,只有精确匹配索引列的查询才有效,不支持范围查询
R-tree(空间索引)空间索引是MylSAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene,Solr,ES

我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。

索引InnoDBMyISAMMemory
B+tree索引支持支持支持
Hash索引不支持不支持支持
R-tree索引不支持支持不支持
Full-text5.6版本之后支持支持不支持
B-Tree(多路平衡查找树)

以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针):

具体动态变化的过程可以参考网站:https://www.cs.usfca.edu/~galles/visualization/BTree.html

B+Tree

相对于B-Tree区别:

  • ①.所有的数据都会出现在叶子节点
  • ②.叶子节点形成一个单向链表

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

Hash

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。 如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

 Hash索引特点

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

存储引擎支持

在MySQL中,支持hash索引的是Memory引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

为什么InnoDB存储引擎选择使用B+tree索引结构?
  • 相对于二叉树,层级更少,搜索效率高;
  • 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一 页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的 高度,导致性能降低;
  • 相对Hash索引,B+tree支持范围匹配及排序操作;
索引分类

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

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

回表查询:先在二级索引中找到对应的主键值,再到聚集索引中拿到这一行的行数据。

索引语法 

创建索引

create [unique|fulltext] index index_name on table_name(index_col_name); 

查看索引

show index from table_name;

删除索引

drop index index_name on table_name
SQL性能分析工具
 SQL执行频率

MySQL客户端连接成功后,通过show[sessionlglobal] status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的 INSERT、UPDATE、DELETE、SELECT的访问频次:

 show global status like 'Com_______';
慢查询日志

 慢查询日志记录了所有执行时间超过指定参数(long_query_time, 单位:秒,默认10秒)的所有SQL语句的日志。

查询慢查询日志状态:

show variables like 'slow_query_log';

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

#开启MySQL慢日志查询开关
slow_query_log=1
#设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2
 profile详情

执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时:

#查看每一条SQL的耗时基本情况
show profiles;
#查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;
#查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;

 explain执行计划

EXPLAIN 或者 DESC命令获取 MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。 

语法:#直接在select语句之前加上关键字explain/ desc 
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件

 EXPLAIN 执行计划各字段含义:

  • ld select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。
  • select_type 表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、 UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等
  • type 表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all。
  • possible_key 显示可能应用在这张表上的索引,一个或多个。
  • Key 实际使用的索引,如果为NULL,则没有使用索引。
  • Key_len 表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。
  • rows MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的。
  • filtered 表示返回结果的行数占需读取行数的百分比,filtered的值越大越好。

SQL优化

视图/存储过程/触发器

视图

介绍

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。

通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

语法
创建
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)]AS SELECT语句[WITH[CASCADED|LOCAL]CHECK OPTION]
查询
查看创建视图语句:SHOW CREATE VIEW 视图名称;
查看视图数据:SELECT*FROM 视图名称.…;
修改
方式一:CREATE OR REPLACE VIEW 视图名称[(列名列表)]AS SELECT语句[WITH[CASCADED|LOCAL]CHECK OPTION]
方式二:ALTER VIEW 视图名称[(列名列表)]AS SELECT语句[WITH[CASCADED|LOCAL]CHECK OPTION]
删除
DROP VIEW [IF EXISTS] 视图名称[视图名称]…

视图的检查选项

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定 义。

MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项: CASCADED和LOCAL,默认值为CASCADED。 CASCADED :

create or replace view stu_v1 as select sid, sname from student where sid<20;
select * from stu_v1;
insert into stu_v1 values (21,'hi');-- 插入成功
insert into stu_v1 values (19,'ho');-- 插入成功,不会检查增删改操作create or replace view stu_v3 as select sid, sname from stu_v1 where sid>5 with cascaded check option ;
select * from stu_v3;
insert into stu_v3 values (21,'hii');-- 插入失败
insert into stu_v3 values (3,'hoo');-- 插入失败
insert into stu_v3 values (11,'hio');-- 插入成功create or replace view stu_v5 as select sid, sname from stu_v3 where sid<=15;
insert into stu_v5 values (17,'hii');-- 插入成功
insert into stu_v5 values (21,'hoo');-- 插入失败
insert into stu_v5 values (5,'hio');-- 插入失败

 创建视图时加with cascaded(级联的) check option的话,会检查当前视图还会检查当前视图所以依赖的所有视图它的条件是否满足;

local

create or replace view stu_v2 as select sid, sname from student where sid<20;
select * from stu_v2;
insert into stu_v2 values (21,'hi');-- 插入成功,不满足v2
insert into stu_v2 values (19,'ho');-- 插入成功,不会检查增删改操作create or replace view stu_v4 as select sid, sname from stu_v2 where sid>5 with local check option ;
select * from stu_v4;
insert into stu_v4 values (21,'hii');-- 插入成功,不满足v2
insert into stu_v4 values (3,'hoo');-- 插入失败,不满足v4
insert into stu_v4 values (11,'hio');-- 插入成功create or replace view stu_v6 as select sid, sname from stu_v4 where sid<=15;
insert into stu_v6 values (17,'hii');-- 插入成功,不满足v6
insert into stu_v6 values (21,'hoo');-- 插入成功,不满足v2
insert into stu_v6 values (5,'hio');-- 插入失败,不满足v4

 定义视图时,有检查条件,就进行检查,没有就不进行检查;递归的检查依赖

视图的更新

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。

如果视图包含以下任何一项,则该视图不可更新:

1.聚合函数或窗口函数(SUM()、MIN()、MAX()、COUNT()等)

2. DISTINCT Aae

3. GROUP BY

4. HAVING

5.UNION或者UNION ALL

作用

  • 简单
    • 视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作 每次指定全部的条件。
  • 安全
    • 数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据
  • 数据独立
    • 视图可帮助用户屏蔽真实表结构变化带来的影响。

触发器

介绍

    触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特 性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

    使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。

 语法
创建
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl name FOR EACH ROW --行级触发器
BEGIN
trigger_stmt ;
END;
查看
SHOW TRIGGERS ;
删除
DROP TRIGGER [schema_name.]trigger_name;-如果没有指定schema_name,默认为当前数据库。

-- 准备工作:日志表
create table emoloyee_logs(id int(11) not null auto_increment primary key ,operate varchar(20) not null ,operate_time datetime not null,operate_id int(11) not null ,operate_params varchar(500)
);
-- 插入数据触发器
create trigger tb_employee_insert_triggerafter insert on employee for each row
begininsert into emoloyee_logs(id,operate,operate_time,operate_id,operate_params) values(null,'insert',now(),new.eno,concat('插入的数为:id',new.eno));
end
-- 查看触发器
show triggers ;-- 插入数据
insert into employee values (7,'小2','男','项目部',1500);-- 修改数据的触发器
create trigger tb_employee_update_triggerafter update on employee for each row
begininsert into emoloyee_logs(id,operate,operate_time,operate_id,operate_params) values(null,'update',now(),new.eno,concat('更新之前的数为:name:',old.ename,'| 更新之后的数:name:',new.ename));
end-- 更新数据
update employee set ename='张1' where employee.eno<3;-- 删除数据的触发器
create trigger tb_employee_delete_triggerafter delete on employee for each row
begininsert into emoloyee_logs(id,operate,operate_time,operate_id,operate_params) values(null,'delete',now(),old.eno,concat('删除之前的数为:name:',old.ename));
end-- 删除数据
delete from employee where eno=6;
案例1:
create trigger sc_update_triggerbefore update on sc for each row
beginif old.grade-new.grade>=10 theninsert into sc_G values(new.sno,new.cno,old.grade,now());end if;
end;
-- ----
show triggers ;
-- 更新
update sc set grade=grade-30 where sno='10060101'&&cno='07294001';
update sc set grade=grade-5 where sno='10060102'&&cno='07294002';
update sc set grade=grade-10 where sno='10060103'&&cno='07294002';
-- ----------------------------------------2
create table avg_sno(sno varchar(20) not null ,avg_sno double comment '平均成绩'
);
-- 触发器
create trigger avg_sno_triggerafter update on sc for each row
begininsert into avg_sno values(NEW.sno,(select avg(new.grade) from sc));
end;-- ------
update sc set grade=grade-20 where sno='10060101'&&cno='07294001';
update sc set grade=grade-5 where sno='10060102'&&cno='07294002';
update sc set grade=grade-10 where sno='10060103'&&cno='07294002';

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

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

相关文章

财报解读:三季度的美国零售,“沃尔玛效应”仍在持续

经济学中常用“沃尔玛效应”来指代“消费者减少消费时&#xff0c;会选择每种类别中价格最低的商品”这一现象。作为全球最大的零售商&#xff0c;沃尔玛一定程度上成为了消费市场的风向标。 近日&#xff0c;沃尔玛发布的2024财年第三季度财报显示&#xff0c;其相较去年同期…

22款奔驰S400L升级主动式氛围灯 光影彰显奔驰的完美

新款奔驰S级原车自带64色氛围灯&#xff0c;还可以升级原厂的主动式氛围灯&#xff0c;增加车内的氛围效果。主动式环境氛围灯包含263个LED光源&#xff0c;每隔1.6厘米就有一个LED光源&#xff0c;照明效果较过去明亮10倍&#xff0c;视觉效果更加绚丽&#xff0c;它还可结合智…

Python中的下划线使用教程:单下划线、双下划线和头尾双下划线详解

概要 Python是一种简单、易学、功能强大的编程语言&#xff0c;被广泛应用于各种领域。在Python中&#xff0c;下划线的使用有其特殊的含义和用途。本文将详细介绍Python中的单下划线、双下划线和头尾双下划线的使用教程&#xff0c;帮助读者更好地理解和应用这些特性。 一、单…

干货!ERP软件如何帮助企业实现信息化管理?

ERP即企业资源规划&#xff08;Enterprise Resource Planning&#xff09;系统&#xff0c;其核心是物料的追踪流转。而在物料追踪流转的基础上&#xff0c;又衍生出一系列各类资源计划的管理和追踪。因此ERP发展成为一款集成各类资源计划&#xff0c;也就是集成企业核心业务流…

化学气相沉积(CVD)中的TEOS

在半导体制程中&#xff0c;薄膜的沉积是核心的步骤之一&#xff0c;有接触过CVD的小伙伴应该或多或少听过TEOS这种物质&#xff0c;TEOS作为一种重要的沉积源&#xff0c;尤其在低温氧化硅的生成过程中&#xff0c;发挥了无可替代的角色。今天我们就来聊聊这种物质。 什么是TE…

windows电脑定时开关机设置

设置流程 右击【此电脑】>【管理】 【任务计划程序】>【创建基本任务】 gina 命令 查看 已经添加的定时任务从哪看&#xff1f;这里&#xff1a; 往下滑啦&#xff0c;看你刚才添加的任务&#xff1a;

2015年8月19日 Go生态洞察:Go 1.5版本发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

C++学习之路(二)C++如何实现一个超简单的学生信息管理系统?C++示例和小项目实例

这个示例实现了一个简单的学生信息管理系统。它包括了学生类的定义&#xff0c;可以添加学生信息、显示所有学生信息&#xff0c;将学生信息保存到文件并从文件加载信息。通过这个示例&#xff0c;你可以了解到如何使用类、函数和文件操作来构建一个基本的信息管理系统。 一个简…

【数据结构/C++】栈和队列_链队列

#include <iostream> using namespace std; // 链队列 typedef int ElemType; typedef struct LinkNode {ElemType data;struct LinkNode *next; } LinkNode; typedef struct {LinkNode *front, *rear; } LinkQueue; // 初始化 void InitQueue(LinkQueue &Q) {Q.fron…

【Unity实战】零代码实现物理2d绳子和绳桥效果——Hinge Joint 2D的使用

文章目录 最终效果前言一、绳子1. 方法一简单的实现问题&#xff0c;当我们想移动它时&#xff0c;所有节点就都断开了 2. 方法二精灵骨骼编辑使用精灵骨骼简单制作绳子效果限制每个节点旋转角度更大的质量添加稳定性 二、绳桥补充参考完结 最终效果 前言 本文使用Hinge Joint…

F盘满了变成红色怎么清理?这4个简单方法记得收藏!

“因为我电脑的磁盘比较多&#xff0c;我通常会把一些比较重要的文件放在F盘中。但是很奇怪&#xff0c;我的F盘用着用着就满成红色了&#xff0c;这该怎么办呢&#xff1f;应该怎么进行清理呢&#xff1f;” 我们在使用电脑时都会发现&#xff0c;电脑上有很多的磁盘。我们可以…

2015年7月28日 Go生态洞察:GopherCon 2015综述

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

使用XHProf查找PHP性能瓶颈

使用XHProf查找PHP性能瓶颈 XHProf是facebook 开发的一个测试php性能的扩展&#xff0c;本文记录了在PHP应用中使用XHProf对PHP进行性能优化&#xff0c;查找性能瓶颈的方法。 下载 网上很多是编译安装xhprof-0.9.4版本&#xff0c;应该是用php5&#xff0c;在php8.0下编译x…

怎么申请IP地址证书?

IP地址证书&#xff0c;也称为SSL证书&#xff0c;是一种数字证书&#xff0c;用于在网络传输过程中对IP地址进行加密和解密。它是由受信任的证书颁发机构&#xff08;CA&#xff09;颁发的&#xff0c;用于证明网站所有者身份的真实性和合法性。 一、选择证书颁发机构。首先需…

2015年7月1日 Go生态洞察:GopherChina旅行报告

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【2023年APMCM亚太杯C题】完整数据与解题思路

2023年亚太杯C题 数据下载与搜集重点数据其余数据第一问第二问第三问第四问第五问第六问 数据与思路获取 数据下载与搜集 该题并没有提供数据集&#xff0c;对所需数据进行收集整理是对题目进行求解的基础。在本题中&#xff0c;主要需要以下数据&#xff1a;新能源汽车历史销…

C#,数值计算——多项式插值与外推插值(Poly2D_interp)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Object for two-dimensional polynomial interpolation on a matrix.Construct /// with a vector of x1 values, a vector of x2 values, a matrix of tabulated /// func…

iview table 默认排序字段不高亮解决办法

iview treeSelect 组件封装 1、表格增加排序时触发的方法2、定义三个变量&#xff0c;sortColumnDefaultStyle存放默认的样式&#xff0c;定义页面默认的列以及顺序3、显示的列加上 sortable, 和样式4、使用下面这块代表默认选中5、点击时清除掉默认的排序6、把排序的字段查询时…

【LeetCode刷题-回溯】-- 47.全排列II

47.全排列II 主要需要解决全排列不重复的问题&#xff0c;设定一个规则&#xff0c;保证在填第i个数的时候重复数字只会被填入一次即可&#xff0c;而在本题中&#xff0c;我们选择对原数组排序&#xff0c;保证相同的数字都相邻&#xff0c;然后每次填入的数一定是这个数所在重…

【算法】经典算法题

文章目录 专题一&#xff1a;双指针1. 移动零2. 复写零3. 快乐数4. 盛最多水的容器5. 有效三角形的个数6. 查找总价格为目标值的两个商品7. 三数之和8. 四数之和 专题二&#xff1a;滑动窗口1. 长度最小的子数组2. 无重复字符的最长字串3. 最大连续1的个数 III4. 将 x 减到 0 的…