mysql监控平台怎么做_MySQL监控平台的构建方法

MySQL监控平台的构建方法

发布时间:2020-05-23 14:13:12

来源:亿速云

阅读:159

作者:鸽子

概述

对于MySQL的监控平台,相信大家实现起来有很多了:基于天兔的监控,还有基于zabbix相关的二次开发。相信很多同行都应该已经开始玩起来了。我这边的选型是prometheus + granafa的实现方式。简而言之就是我现在的生产环境使用的是prometheus,还有就是granafa满足的我的日常工作需要。在入门的简介和安装,大家可以参考这里:https://blog.51cto.com/cloumn/detail/77

1、首先看下我们的监控效果、mysql主从

13576e146366be556900f78e3b2b3e74.png

2、mysql状态:

0b4c95642c9049df3da8c8462ed60827.png

1e73671cca1d919fba3b4965f6a90aa4.png

3、缓冲池状态:

f7aee5193d14fc5674df6804299d312e.png

exporter 相关部署

1、安装exporter[root@controller2 opt]# https://github.com/prometheus/mysqld_exporter/releases/download/v0.10.0/mysqld_exporter-0.10.0.linux-amd64.tar.gz

[root@controller2 opt]# tar -xf mysqld_exporter-0.10.0.linux-amd64.tar.gz

2、添加mysql 账户:GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT, RELOAD ON *.* TO 'exporter'@'%' IDENTIFIED BY 'localhost';

flush privileges;

3、编辑配置文件:[root@controller2 mysqld_exporter-0.10.0.linux-amd64]# cat /opt/mysqld_exporter-0.10.0.linux-amd64/.my.cnf

[client]

user=exporter

password=123456

4、设置配置文件:[root@controller2 mysqld_exporter-0.10.0.linux-amd64]# cat /etc/systemd/system/mysql_exporter.service

[Unit]

Description=mysql Monitoring System

Documentation=mysql Monitoring System

[Service]

ExecStart=/opt/mysqld_exporter-0.10.0.linux-amd64/mysqld_exporter \

-collect.info_schema.processlist \

-collect.info_schema.innodb_tablespaces \

-collect.info_schema.innodb_metrics  \

-collect.perf_schema.tableiowaits \

-collect.perf_schema.indexiowaits \

-collect.perf_schema.tablelocks \

-collect.engine_innodb_status \

-collect.perf_schema.file_events \

-collect.info_schema.processlist \

-collect.binlog_size \

-collect.info_schema.clientstats \

-collect.perf_schema.eventswaits \

-config.my-cnf=/opt/mysqld_exporter-0.10.0.linux-amd64/.my.cnf

[Install]

WantedBy=multi-user.target

5、添加配置到prometheus server- job_name: 'mysql'

static_configs:

- targets: ['192.168.1.11:9104','192.168.1.12:9104']

6、测试看有没有返回数值:

http://192.168.1.12:9104/metrics

正常我们通过mysql_up可以查询倒mysql监控是否已经生效,是否起起来#HELP mysql_up Whether the MySQL server is up.

#TYPE mysql_up gauge

mysql_up 1

监控相关指标

在做任何一个东西监控的时候,我们要时刻明白我们要监控的是什么,指标是啥才能更好的去监控我们的服务,在mysql里面我们通常可以通过一下指标去衡量mysql的运行情况:mysql主从运行情况、查询吞吐量、慢查询情况、连接数情况、缓冲池使用情况以及查询执行性能等。

主从复制运行指标:

1、主从复制线程监控:

大部分情况下,很多企业使用的都是主从复制的环境,监控两个线程是非常重要的,在mysql里面我们通常是通过命令:MariaDB [(none)]> show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 172.16.1.1

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000045

Read_Master_Log_Pos: 72904854

Relay_Log_File: mariadb-relay-bin.000127

Relay_Log_Pos: 72905142

Relay_Master_Log_File: mysql-bin.000045

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

#Slave_IO_Running、Slave_SQL_Running两个线程正常那么说明我们的复制集群是健康状态的。

MySQLD Exporter中返回的样本数据中通过mysql_slave_status_slave_sql_running来获取主从集群的健康状况。# HELP mysql_slave_status_slave_sql_running Generic metric from SHOW SLAVE STATUS.

# TYPE mysql_slave_status_slave_sql_running untyped

mysql_slave_status_slave_sql_running{channel_name="",connection_name="",master_host="172.16.1.1",master_uuid=""} 1

2、主从复制落后时间:

在使用show slave status 里面还有一个关键的参数Seconds_Behind_Master。Seconds_Behind_Master表示slave上SQL thread与IO thread之间的延迟,我们都知道在MySQL的复制环境中,slave先从master上将binlog拉取到本地(通过IO thread),然后通过SQL thread将binlog重放,而Seconds_Behind_Master表示本地relaylog中未被执行完的那部分的差值。所以如果slave拉取到本地的relaylog(实际上就是binlog,只是在slave上习惯称呼relaylog而已)都执行完,此时通过show slave status看到的会是0

Seconds_Behind_Master: 0

MySQLD Exporter中返回的样本数据中通过mysql_slave_status_seconds_behind_master 来获取相关状态。# HELP mysql_slave_status_seconds_behind_master Generic metric from SHOW SLAVE STATUS.

# TYPE mysql_slave_status_seconds_behind_master untyped

mysql_slave_status_seconds_behind_master{channel_name="",connection_name="",master_host="172.16.1.1",master_uuid=""} 0

查询吞吐量:

说到吞吐量,那么我们如何从那方面来衡量呢?

通常来说我们可以根据mysql 的插入、查询、删除、更新等操作来

为了获取吞吐量,MySQL 有一个名为 Questions 的内部计数器(根据 MySQL 用语,这是一个服务器状态变量),客户端每发送一个查询语句,其值就会加一。由 Questions 指标带来的以客户端为中心的视角常常比相关的Queries 计数器更容易解释。作为存储程序的一部分,后者也会计算已执行语句的数量,以及诸如PREPARE 和 DEALLOCATE PREPARE 指令运行的次数,作为服务器端预处理语句的一部分。可以通过命令来查询:MariaDB [(none)]> SHOW GLOBAL STATUS LIKE "Questions";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Questions     | 15071 |

+---------------+-------+

MySQLD Exporter中返回的样本数据中通过mysql_global_status_questions反映当前Questions计数器的大小:# HELP mysql_global_status_questions Generic metric from SHOW GLOBAL STATUS.

# TYPE mysql_global_status_questions untyped

mysql_global_status_questions 13253

当然由于prometheus 具有非常丰富的查询语言,我们可以通过这个累加的计数器来查询某一短时间内的查询增长率情况,可以做相关的阈值告警处理、例如一下查询2分钟时间内的查询情况:

rate(mysql_global_status_questions[2m])

当然上面是总量,我们可以分别从监控读、写指令的分解情况,从而更好地理解数据库的工作负载、找到可能的瓶颈。通常,通常,读取查询会由 Com_select 指标抓取,而写入查询则可能增加三个状态变量中某一个的值,这取决于具体的指令:

Writes = Com_insert + Com_update + Com_delete

下面我们通过命令获取插入的情况:MariaDB [(none)]> SHOW GLOBAL STATUS LIKE "Com_insert";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Com_insert    | 10578 |

+---------------+-------+

从MySQLD Exporter的/metrics返回的监控样本中,可以通过global_status_commands_total获取当前实例各类指令执行的次数:# HELP mysql_global_status_commands_total Total number of executed MySQL commands.

# TYPE mysql_global_status_commands_total counter

mysql_global_status_commands_total{command="create_trigger"} 0

mysql_global_status_commands_total{command="create_udf"} 0

mysql_global_status_commands_total{command="create_user"} 1

mysql_global_status_commands_total{command="create_view"} 0

mysql_global_status_commands_total{command="dealloc_sql"} 0

mysql_global_status_commands_total{command="delete"} 3369

mysql_global_status_commands_total{command="delete_multi"} 0

慢查询性能

查询性能方面,慢查询也是查询告警的一个重要的指标。MySQL还提供了一个Slow_queries的计数器,当查询的执行时间超过long_query_time的值后,计数器就会+1,其默认值为10秒,可以通过以下指令在MySQL中查询当前long_query_time的设置:MariaDB [(none)]> SHOW VARIABLES LIKE 'long_query_time';

+-----------------+-----------+

| Variable_name   | Value     |

+-----------------+-----------+

| long_query_time | 10.000000 |

+-----------------+-----------+

1 row in set (0.00 sec)

#当然我们也可以修改时间MariaDB [(none)]> SET GLOBAL long_query_time = 5;

Query OK, 0 rows affected (0.00 sec)

然后我们而已通过sql语言查询MySQL实例中Slow_queries的数量:MariaDB [(none)]> SHOW GLOBAL STATUS LIKE "Slow_queries";

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| Slow_queries  | 0     |

+---------------+-------+

1 row in set (0.00 sec)

MySQLD Exporter返回的样本数据中,通过mysql_global_status_slow_queries指标展示当前的Slow_queries的值:# HELP mysql_global_status_slow_queries Generic metric from SHOW GLOBAL STATUS.

# TYPE mysql_global_status_slow_queries untyped

mysql_global_status_slow_queries 0

同样的,更具根据Prometheus 慢查询语句我们也可以查询倒他某段时间内的增长率:

rate(mysql_global_status_slow_queries[5m])

连接数监控

监控客户端连接情况相当重要,因为一旦可用连接耗尽,新的客户端连接就会遭到拒绝。MySQL 默认的连接数限制为 151。MariaDB [(none)]> SHOW VARIABLES LIKE 'max_connections';

+-----------------+-------+

| Variable_name   | Value |

+-----------------+-------+

| max_connections | 151   |

+-----------------+-------+

当然我们可以修改配置文件的形式来增加这个数值。与之对应的就是当前连接数量,当我们当前连接出来超过系统设置的最大值之后常会出现我们看到的Too many connections(连接数过多),下面我查找一下当前连接数:MariaDB [(none)]> SHOW GLOBAL STATUS LIKE "Threads_connected";

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| Threads_connected | 41     |

+-------------------+-------

当然mysql 还提供Threads_running 这个指标,帮助你分隔在任意时间正在积极处理查询的线程与那些虽然可用但是闲置的连接。MariaDB [(none)]> SHOW GLOBAL STATUS LIKE "Threads_running";

+-----------------+-------+

| Variable_name   | Value |

+-----------------+-------+

| Threads_running | 10     |

+-----------------+-------+

如果服务器真的达到 max_connections 限制,它就会开始拒绝新的连接。在这种情况下,Connection_errors_max_connections 指标就会开始增加,同时,追踪所有失败连接尝试的Aborted_connects 指标也会开始增加。

MySQLD Exporter返回的样本数据中:# HELP mysql_global_variables_max_connections Generic gauge metric from SHOW GLOBAL VARIABLES.

# TYPE mysql_global_variables_max_connections gauge

mysql_global_variables_max_connections 151

#表示最大连接数# HELP mysql_global_status_threads_connected Generic metric from SHOW GLOBAL STATUS.

# TYPE mysql_global_status_threads_connected untyped

mysql_global_status_threads_connected 41

#表示当前的连接数# HELP mysql_global_status_threads_running Generic metric from SHOW GLOBAL STATUS.

# TYPE mysql_global_status_threads_running untyped

mysql_global_status_threads_running 1

#表示当前活跃的连接数# HELP mysql_global_status_aborted_connects Generic metric from SHOW GLOBAL STATUS.

# TYPE mysql_global_status_aborted_connects untyped

mysql_global_status_aborted_connects 31

#累计所有的连接数# HELP mysql_global_status_connection_errors_total Total number of MySQL connection errors.

# TYPE mysql_global_status_connection_errors_total counter

mysql_global_status_connection_errors_total{error="internal"} 0

#服务器内部引起的错误、如内存硬盘等

mysql_global_status_connection_errors_total{error="max_connections"} 0

#超出连接处引起的错误

当然根据prom表达式,我们可以查询当前剩余可用的连接数:

mysql_global_variables_max_connections - mysql_global_status_threads_connected

查询mysq拒绝连接数

mysql_global_status_aborted_connects

缓冲池情况:

MySQL 默认的存储引擎 InnoDB 使用了一片称为缓冲池的内存区域,用于缓存数据表与索引的数据。缓冲池指标属于资源指标,而非工作指标,前者更多地用于调查(而非检测)性能问题。如果数据库性能开始下滑,而磁盘 I/O 在不断攀升,扩大缓冲池往往能带来性能回升。

默认设置下,缓冲池的大小通常相对较小,为 128MiB。不过,MySQL 建议可将其扩大至专用数据库服务器物理内存的 80% 大小。我们可以查看一下:MariaDB [(none)]> show global variables like 'innodb_buffer_pool_size';

+-------------------------+-----------+

| Variable_name           | Value     |

+-------------------------+-----------+

| innodb_buffer_pool_size | 134217728 |

+-------------------------+-----------+

MySQLD Exporter返回的样本数据中,使用mysql_global_variables_innodb_buffer_pool_size来表示。# HELP mysql_global_variables_innodb_buffer_pool_size Generic gauge metric from SHOW GLOBAL VARIABLES.

# TYPE mysql_global_variables_innodb_buffer_pool_size gauge

mysql_global_variables_innodb_buffer_pool_size 1.34217728e+08

Innodb_buffer_pool_read_requests记录了正常从缓冲池读取数据的请求数量。可以通过以下指令查看

MariaDB [(none)]> SHOW GLOBAL STATUS LIKE "Innodb_buffer_pool_read_requests";

+----------------------------------+-------------+

| Variable_name                    | Value       |

+----------------------------------+-------------+

| Innodb_buffer_pool_read_requests | 38465 |

+----------------------------------+-------------+

MySQLD Exporter返回的样本数据中,使用mysql_global_status_innodb_buffer_pool_read_requests来表示。# HELP mysql_global_status_innodb_buffer_pool_read_requests Generic metric from SHOW GLOBAL STATUS.

# TYPE mysql_global_status_innodb_buffer_pool_read_requests untyped

mysql_global_status_innodb_buffer_pool_read_requests 2.7711547168e+10

当缓冲池无法满足时,MySQL只能从磁盘中读取数据。Innodb_buffer_pool_reads即记录了从磁盘读取数据的请求数量。通常来说从内存中读取数据的速度要比从磁盘中读取快很多,因此,如果Innodb_buffer_pool_reads的值开始增加,可能意味着数据库的性能有问题。 可以通过以下只能查看Innodb_buffer_pool_reads的数量MariaDB [(none)]> SHOW GLOBAL STATUS LIKE "Innodb_buffer_pool_reads";

+--------------------------+-------+

| Variable_name            | Value |

+--------------------------+-------+

| Innodb_buffer_pool_reads | 138  |

+--------------------------+-------+

1 row in set (0.00 sec)

MySQLD Exporter返回的样本数据中,使用mysql_global_status_innodb_buffer_pool_read_requests来表示。# HELP mysql_global_status_innodb_buffer_pool_reads Generic metric from SHOW GLOBAL STATUS.

# TYPE mysql_global_status_innodb_buffer_pool_reads untyped

mysql_global_status_innodb_buffer_pool_reads 138

通过以上监控指标,以及实际监控的场景,我们可以利用PromQL快速建立多个监控项。可以查看两分钟内读取磁盘的增长率的增长率:

rate(mysql_global_status_innodb_buffer_pool_reads[2m])

官方模板ID

上面是我们简单列举的一些指标,下面我们使用granafa给 MySQLD_Exporter添加监控图表:主从主群监控(模板7371):

相关mysql 状态监控7362:

缓冲池状态7365:

简单的告警规则

除了相关模板之外,没有告警规则那么我们的监控就是不完美的,下面列一下我们的监控告警规则groups:

- name: MySQL-rules

rules:

- alert: MySQL Status

expr: up == 0

for: 5s

labels:

severity: warning

annotations:

summary: "{{$labels.instance}}: MySQL has stop !!!"

description: "检测MySQL数据库运行状态"

- alert: MySQL Slave IO Thread Status

expr: mysql_slave_status_slave_io_running == 0

for: 5s

labels:

severity: warning

annotations:

summary: "{{$labels.instance}}: MySQL Slave IO Thread has stop !!!"

description: "检测MySQL主从IO线程运行状态"

- alert: MySQL Slave SQL Thread Status

expr: mysql_slave_status_slave_sql_running == 0

for: 5s

labels:

severity: warning

annotations:

summary: "{{$labels.instance}}: MySQL Slave SQL Thread has stop !!!"

description: "检测MySQL主从SQL线程运行状态"

- alert: MySQL Slave Delay Status

expr: mysql_slave_status_sql_delay == 30

for: 5s

labels:

severity: warning

annotations:

summary: "{{$labels.instance}}: MySQL Slave Delay has more than 30s !!!"

description: "检测MySQL主从延时状态"

- alert: Mysql_Too_Many_Connections

expr: rate(mysql_global_status_threads_connected[5m]) > 200

for: 2m

labels:

severity: warning

annotations:

summary: "{{$labels.instance}}: 连接数过多"

description: "{{$labels.instance}}: 连接数过多,请处理 ,(current value is: {{ $value }})"

- alert: Mysql_Too_Many_slow_queries

expr: rate(mysql_global_status_slow_queries[5m]) > 3

for: 2m

labels:

severity: warning

annotations:

summary: "{{$labels.instance}}: 慢查询有点多,请检查处理"

description: "{{$labels.instance}}: Mysql slow_queries is more than 3 per second ,(current value is: {{ $value }})"

2、添加规则到prometheus:rule_files:

- "rules/*.yml"

3、打开web ui我们可以看到规则生效了:

d45db80bf637c9059bd1eee137e7d3af.png

总结

到处监控mysql的相关状态已经完成,大家可以根据mysql更多的监控指标去完善自己的监控,当然这一套就是我用在线上环境的,可以参考参考。

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

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

相关文章

查看宝塔面板账号密码命令_宝塔面板升级到最新版图文教程

往期教程:宝塔面板教程(1)基于云服务器搭建宝塔面板教程最全详解宝塔面板教程(2)宝塔面板添加WordPress站点详细图文教程宝塔面板教程(3)基于宝塔面板成功配置网站SSL安全证书宝塔面板教程&…

python 对象引用、可变性 和 垃圾回收

文章目录1. 变量是标签2. 元组的相对不可变性3. 默认浅复制4. 函数的参数作为引用时5. del 和 垃圾回收6. 弱引用7. 一些可能的坑!!!learn from 《流畅的python》 1. 变量是标签 >>> a [1, 2, 3] >>> b a >>&g…

关于原型的一点总结

原型(prototype)无疑是JavaScript中一个十分重要的概念,围绕着原型所涉及的原型链继承、内建对象扩展,JS表现出独特的面向对象特性。 1.什么是原型每个JS的函数对象中都有一个默认的prototype属性,它指向的就是这个函数…

python canopen_Python canopener包_程序模块 - PyPI - Python中文网

用于打开文件的python便利函数canopener(filename, moder)。本地文件的行为与open():>>> canopener(local_file.txt)url也可以作为文件名传递并打开进行读取。urllib2.urlopen()是在封面下使用的,因此它具有同等的支持:>>>…

天池 在线编程 最长AB子串(哈希)

文章目录1. 题目2. 解题1. 题目 描述 给你一个只由字母’A’和’B’组成的字符串s&#xff0c;找一个最长的子串&#xff0c;要求这个子串里面’A’和’B’的数目相等&#xff0c;输出该子串的长度。 这个子串可以为空。 s的长度n满足 2<n<1000000。示例 样例1 输入: s…

Tomcat 打开一闪而过

转载于:https://www.cnblogs.com/super90/p/4504326.html

java怎么递归_Java的递归、如何与流相结合

递归技术需求&#xff1a;扫描D:\test所有子文件夹及子子文件夹下的.jpg文件。我们如果用循环来做这件事&#xff0c;我们不知道循环的结束条件&#xff0c;也不知道到底有多少层&#xff0c;所以比较麻烦。我们可以用一种新的思想&#xff1a;递归。递归举例&#xff1a;从前有…

假设有搅乱顺序的一群儿童成一个队列_数据结构与算法系列之栈amp;队列(GO)...

以下完整代码均可从这里获取栈栈的基本概念「后进先出、先进后出就是典型的栈结构」。栈可以理解成一种受了限制的线性表&#xff0c;插入和删除都只能从一端进行当某个数据集合只涉及在一端插入和删除数据&#xff0c;并且满足后进先出、先进后出的特性&#xff0c;就应该首选…

datagridview 动态插入图片_挑战一张照片制作动态PPT背景

在PPT中&#xff0c;要做出好看的页面动画效果&#xff0c;常常需要用很多图片和装饰元素。而如果你手头的素材只有一张照片&#xff0c;如何才能快速做出好看的PPT背景效果呢&#xff1f;本期内容&#xff0c;我们就来一起挑战&#xff0c;使用一张照片&#xff0c;制作PPT动态…

sed搜索某行在行末追加_示范sed指定某行插入 追加和全局替换

有时候会有这样的需求&#xff0c;在指定的行后面或者是前面追加一行&#xff0c;这个时候可以使用sed来完成&#xff0c;具体用法如下a\ 在指定的行后面追加一行b\ 在指定的行前面追加一行使用指定的行号追加内容&#xff0c;在使用行号的过程中&#xff0c;需要注意的问题有以…

LeetCode 1941. 检查是否所有字符出现次数相同

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;如果 s 是一个 好 字符串&#xff0c;请你返回 true &#xff0c;否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 &#xff0c;那么我们称字符串 s 是 好 字符串。 示例 1&#xff1a; 输入&…

java初学者定远期目标_JAVA题,新手求解

展开全部类图设计&#xff1a;类设计&#xff1a;package car;public class Car {private String id;private String name;public void setId(String id) {this.id id;}public void setName(String name) {this.name name;}/*** 获取汽车编e69da5e6ba9062616964757a686964616…

LeetCode 1942. 最小未被占据椅子的编号(set)

文章目录1. 题目2. 解题1. 题目 有 n 个朋友在举办一个派对&#xff0c;这些朋友从 0 到 n - 1 编号。 派对里有 无数 张椅子&#xff0c;编号为 0 到 infinity 。 当一个朋友到达派对时&#xff0c;他会占据 编号最小 且未被占据的椅子。 比方说&#xff0c;当一个朋友到达时…

vue路由懒加载_优化vue项目的首屏加载速度

最近使用vue-cli3构建了一个小型的博客系统&#xff0c;完工之后&#xff0c;build打包出来发现一个chunk-vendors包就有1.1m&#xff0c;部署上去之后&#xff0c;访问的时候&#xff0c;首屏加载非常慢。居然需要21s&#xff0c;体验极差。这是打包的结果截图根据这种情况&am…

LeetCode 1943. 描述绘画结果(差分思想)

文章目录1. 题目2. 解题1. 题目 给你一个细长的画&#xff0c;用数轴表示。 这幅画由若干有重叠的线段表示&#xff0c;每个线段有 独一无二 的颜色。 给你二维整数数组 segments &#xff0c;其中 segments[i] [starti, endi, colori] 表示线段为 半开区间 [starti, endi) 且…

LeetCode 1944. 队列中可以看到的人数(单调栈)

文章目录1. 题目2. 解题1. 题目 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。 给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heights[i] 表示第 i 个人的高度。 一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他…

yolov2训练_一文看懂YOLO v2

我的CSDN博客&#xff1a;https://blog.csdn.net/litt1e我的公众号&#xff1a;工科宅生活概述新的YOLO版本论文全名叫“YOLO9000: Better, Faster, Stronger”&#xff0c;相较于YOLO主要有两个大方面的改进&#xff1a;第一&#xff0c;作者使用了一系列的方法对原来的YOLO多…

java的foeachr循环_for循环和Dowhile循环的应用

DoWhile循环{public static void main(String[] args) {int i 0;int sum 0;do {sum sum i;i;} while (i < 100);System.out.println(sum);}}{int a 0;while (a<0){System.out.println(a);a;}System.out.println("");do {System.out.println(a);a;}while (…

LeetCode 1945. 字符串转化后的各位数字之和

文章目录1. 题目2. 解题1. 题目 给你一个由小写字母组成的字符串 s &#xff0c;以及一个整数 k 。 首先&#xff0c;用字母在字母表中的位置替换该字母&#xff0c;将 s 转化 为一个整数&#xff08;也就是&#xff0c;‘a’ 用 1 替换&#xff0c;‘b’ 用 2 替换&#xff…

LeetCode 1955. 统计特殊子序列的数目

文章目录1. 题目2. 解题1. 题目 特殊序列 是由 正整数 个 0 &#xff0c;紧接着 正整数 个 1 &#xff0c;最后 正整数 个 2 组成的序列。 比方说&#xff0c;[0,1,2] 和 [0,0,1,1,1,2] 是特殊序列。 相反&#xff0c;[2,1,0] &#xff0c;[1] 和 [0,1,2,0] 就不是特殊序列。…