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

做财经比较好的网站有哪些/河南网站建设哪个公司做得好

做财经比较好的网站有哪些,河南网站建设哪个公司做得好,松江城乡建设委员会的网站,易语言做网站图片下载根据Mysql索引原理及优化这个博主的视频学习,对现在的岁月云项目中mysql进行优化,我要向这个博主致敬,之前应用居多,理论所知甚少,于是将学习到东西,应用下来,看看是否有好的改观。 1 索引原理…

根据Mysql索引原理及优化这个博主的视频学习,对现在的岁月云项目中mysql进行优化,我要向这个博主致敬,之前应用居多,理论所知甚少,于是将学习到东西,应用下来,看看是否有好的改观。

1 索引原理

1.1 B+Tree

        索引的目的是用来快速查询的,怎样查找快,这就用到大学所学的数据结构的知识。理论不需要我来写,视频博主讲的比我好。我只记录我所理解的。如果所有的左边都比当前节点小,所有的右边都比当前节点大,这样就很容易缩小范围,于是想到二叉查找树。

        但是二叉查找树,当数据有序的时候,就可能比较惨,形成单向链表,时间复杂度升级为O(n),于是就有了平衡二叉树(AVL 树),因为平衡,所以查询稳定,但是因为一个节点最多有两个节点,树高问题依旧存在。

        于是就有了B树,因为B树允许一个节点存放多个数据,树高再次降低,但B树的存储结构是key和data都在节点中,这就是一则使得查询性能不稳定,二则因为节点也保存了数据,内存增加,且data大了,key就小了,节点自然也就增多了,B树的层高也相应就升高了,I/0次数增加,性能就会变差。另外B树的数据在树的节点当中,因此适合随机查询,而不适合范围查询,在Btree在线,这个地方可以演示插入的过程。

        接着思想演化为选择B+树,B+树的特点是叶子节点包括全部关键字和相应记录的指针,则查询自然是稳定的,B+tree中叶子节点采用双向链表的结构,则范围查询的问题也就解决了。非叶子节点只有索引没有数据,因此一节点就可以存储更多的内容,树高就降低了。

        InnoDB中最小存储单元是页(每页16KB),mysql设计者将B+Tree的一个节点大小设置为一个页(16KB),这样每个节点只需要一次IO就能够完整载入整页数据。知道了这个概念就知道后面查询成本怎么计算的。

        一个高度为2的B+Tree,存在一个根节点和若干叶子节点,总记录数=根节点指针数*单个叶子节点的记录数。如果是主键索引(聚簇索引)根节点指针数根据主键长度来,mysql中int类型占4个字节,指针类型占6个字节,那么一页16*1024/(4+6)=1638,即一个节点最多存储1638个索引指针。每个叶子节点记录数,跟一行记录大小有关,如果一行记录为1KB,则一页记录16行,如此得出高度为2的B+Tree,总记录数=1638*16=26208。同理告诉为3的B+Tree,可以存放记录数=1638*1638*16=42,928,704,所以并不是别人说的mysql单表不能超过2000万这个固定数字。

1.2 聚簇索引

1.2.1 回表

         InnoDB 使用聚簇索引来存储表的数据,而辅助索引的叶子节点不仅包含索引列的值,还包含对应的主键值。这种设计使得通过辅助索引查找数据时,能够快速定位到聚簇索引中的具体行位置。

        因此就有了回表操作,先查辅助索引,但获取数据实际是根据聚簇索引(主键索引)得到对应的数据,这个过程就是回表,扫描了辅助索引树和聚簇索引树。

        使用覆盖索引解决回表问题。一个索引包含了所需查询的所有字段,就可以不需要回表。这个方法虽然没有问题,但是中小型系统估计就不会去考虑这个优化,研发成本跟这点性能成本比更本就不算什么。

1.2.2 索引下推

        mysql5.6引入,用于查询优化,在索引遍历过程中,对于索引包含的字段先做判断,把不符合条件的记录过滤掉,减少回表次数。

1.2.3 主键类型选择

        多语言、表情符号和减少编码转换,使得utf8mb4 成为首选。在utf8mb4中1个char占4个字节。执行下面的语句,可以知道自己的表中各字段占用的空间。

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, CHARACTER_OCTET_LENGTH,CASEWHEN DATA_TYPE IN ('char', 'varchar') THEN CHARACTER_OCTET_LENGTHWHEN DATA_TYPE = 'tinyint' THEN 1WHEN DATA_TYPE = 'smallint' THEN 2WHEN DATA_TYPE = 'mediumint' THEN 3WHEN DATA_TYPE = 'int' THEN 4WHEN DATA_TYPE = 'bigint' THEN 8WHEN DATA_TYPE IN ('float', 'double') THEN NUMERIC_PRECISION / 8 + 1WHEN DATA_TYPE = 'decimal' THEN CEIL(NUMERIC_PRECISION / 9) * 4 + IF(NUMERIC_SCALE > 0, 2, 0)ELSE NULLEND AS estimated_bytes
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'acc'AND TABLE_NAME = 'acc_analysis_equation';

          知道这个基础,就知道数据表中状态字段最好使用tinyint,不要使用char了。而如下面bigint也才8个字节,如果使用32位uuid,则需要128个字节,索引存储空间相比下将16倍。

2 Explain性能分析

2.1 单表

       从慢日志中找到一条插入时的问题,explain结果如下:

        创建索引后,再次查看 ,这个语句就过关了。

        不要小看这个索引创建,可以再慢日志可以看到有很多相同的语句,这样性能就会提升很多了。下图可以看到Rows_examined预计扫码记录数203万,这个数据不小。

2.2 联表

        以下面的慢日志样例作explain。

  • id:表示查询中执行子句或操作表的顺序,id相同执行的顺序是由上到下。如果由子查询,id是不同的。id越大执行优先级越高,也就是说子查询会优先执行
  • type:找到数据所需要的扫码方式,重要指标

        完整的连接类型,一般需要保证查询至少range级别,最好能到ref。const代表主键索引或者唯一索引;req_ref代表对于前表中每一行,后表只有一行被扫描,这个只连接使用索引的部分都是主键或者唯一非空索引,才会出现;ref代表普通索引,对于前表的每一行,后表有可能有多于一行的数据被扫描。range代表范围查询,between、in、>、<都是范围查询。index代表SQL使用了索引,但没有通过索引进行过滤,需要扫描索引上的全部数据,例如Innodb索引count查询就会扫描索引上的全部数据进行统计

system>const>eq_ref>ref>fulltext>ref_or_null
>index_merge>unique_subquery>index_subquery
>range>index>ALL
  • possible_keys:可能应用到这张表的索引,一个或多个,列出但实际不一定会用
  • key:实际使用的索引,若为null,两种情况:1、没有建立索引。2、建立索引,但索引失效。查询中使用了覆盖索引,该索引只会出现在key列表中。
  • key_len:索引中使用的字节数。

        

  • ref:const代表常数等值查询、连接查询中,ref字段显示驱动表关联的字段。

  • rows:表示mysql在检索时估算的行记录数量。
  • extra:①using filesort:查询结果进行文件排序,性能非常差需要优化;②Using temporary;使用临时表存储数据结果。③Using where:查询的列未被索引覆盖,被全表扫描。④Using index:使用了索引获取数据,使用到了聚簇索引或者覆盖索引,非常好。⑤Using join buffer:使用了连接缓存,会显示join连接查询时所需要的查询算法。⑥Using index condition:表示了使用了索引下推,仅适用于二级索引,因为聚簇索引完整记录是被InnoDb缓存中。

3 高性能索引创建及使用策略

3.1 索引列类型尽量小

        知道了索引原理,就知道了,索引列类型越小,那么索引空间就比较少,查询性能也就越快,一个页纳入更多的索引数据,也就减少了磁盘IO损耗。内存中可以纳入更多的数据页缓存,在实战中更关注在选择自增、雪花id还是uuid。

        int类型自增,对于绝大多数项目是够用的,但是多租户模式下一般用联合所以,这个自增就不太起作用。就可以用到雪花id。而uuid是字符串,排序自然是按照字母的循序,而因为字母是无序的,自然查询性能就慢一些。

3.2 选择性尽量高

        索引是为了快速定位,如果选择性低的,比如凭证类型、性别之类的,基本就是固定选项,这些字段设置索引就没有多大意义,不能帮你过滤大批的数据。

        例如下例中,现有的group_id是凭证类型:收、记、付、转,只会有四个选项,更甚的是大多数用户用的都是记账凭证。

         按照选择性公式计算,选择性=不同值得数量/总行数,按照下面得计算,选择性0.0025,非常低,代表group_id列重复性很高,不适合作为索引项。选择性越高越适合作为索引项。因此需要将group_id列从联合索引中去除,以缩短索引字段长度,存储更多有效数据。

        对比一下去掉前后,从下面可以看到没有变化,因此这个索引字段去掉是合理得。

        因为数据库做了分表,于是写一个存储过程批量更新表索引,如下

BEGIN-- 定义一个游标来遍历表名DECLARE done INT DEFAULT FALSE;DECLARE tbl_name VARCHAR(255);DECLARE cur CURSOR FORSELECT table_nameFROM information_schema.tablesWHERE table_schema = DATABASE() AND  table_name REGEXP '^acc_voucher_[0-9]+$';DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur;read_loop: LOOPFETCH cur INTO tbl_name;IF done THENLEAVE read_loop;END IF;-- 删除旧索引SET @sql = CONCAT('ALTER TABLE ', tbl_name,' DROP INDEX `idx_adId_period_groupId_num`');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;-- 添加新索引SET @sql = CONCAT('ALTER TABLE ', tbl_name,' ADD INDEX `idx_adId_period_num` (`as_id`, `period`, `num`) USING BTREE');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;END LOOP;CLOSE cur;
END

3.3 最佳左前缀法则

        针对联合查询,因为索引排序也是有比较过程,多个字段肯定有一个顺序,你多个索引字段,自然回选择左的字段作为先排序的。这里有回到了B+Tree的原理了,B+Tree是局部有序。

        查看下面的索引,最左指的是索引Fieds左边第一,并不是where条件的最左,因为查询引擎会进行优化。

         从下图可以看到索引失效了,进行了全表扫描。

        接着我们调整索引顺序,将relate_company调整到最左边,再次查看索引生效。

3.4 like使用

3.5 null值

3.6 不要对索引列做任何操作

        索引减少了磁盘IO,因此可以先获取数据,然后通过程序来做你想做的业务,而不是在sql语句上去做业务直接相关的函数操作,因为索引列作函数操作,导致索引失效,而内存速度与磁盘IO速度无法媲美。因此才有这个原则。

        字符串类型隐式转换问题,如下面accounting_standard字段定义的char(1),可以查看到key_len是4,已经发生了隐式转换.

        下面是按照字符串的方式查找,扫描的rows相比隐式转换的要少。 

4 慢日志查询分析

4.1 慢日志参数

      my.cnf配置3个配置跟他有关系

# 开启慢日志
slow_query_log = 1
# 慢日志的位置
slow_query_log_file             = /data/mysql_3306/logs/sql_query_slow.log
# 单位为s
long_query_time = 1

        log_queries_not_using_indexes表述为使用索引的查询,也会被记录到慢查询日志中,因此再调优的时候,需要开启,执行命令set global log_queries_not_using_indexes=1;

mysql> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.02 sec)mysql> show variables like '%log_queries%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF   |
+-------------------------------+-------+
1 row in set (0.01 sec)

4.2 慢日志样例 

4.2.1 超过long_query_time示例

         从慢查询中选取一条查看,Query_time表明查询执行的时间,Lock_time为等待锁的时间,Rows_sent表示查询结果的数量,Rows_examine表示查询扫描的行数。

# Time: 2024-12-06T13:25:50.570195+08:00
# User@Host: root[root] @  [10.101.12.88]  Id: 367258
# Query_time: 1.286461  Lock_time: 0.000064 Rows_sent: 420  Rows_examined: 2044
SET timestamp=1733462750;
selectaccVoucher.as_id as_id_accVoucher, accVoucher.id id_accVoucher, accVoucher.group_id group_id_accVoucher,accVoucherEntry.debit_amount debit_amount_accVoucherEntry, accVoucherEntry.credit_amountcredit_amount_accVoucherEntry,accVoucherEntry.price price_accVoucherEntry, accVoucherEntry.count count_accVoucherEntry,accVoucherEntry.fc_id fc_id_accVoucherEntry, accVoucherEntry.rate rate_accVoucherEntry,accVoucherEntry.debit_amount_original debit_amount_original_accVoucherEntry,accVoucherEntry.credit_amount_original credit_amount_original_accVoucherEntry,accVoucherEntry.line_num line_num_accVoucherEntryfrom acc_voucher_15 accVoucherinner join acc_voucher_entry_15 accVoucherEntry on accVoucherEntry.v_id = accVoucher.id andaccVoucherEntry.as_id=accVoucher.as_idWHERE (accVoucher.as_id = 112665 AND accVoucher.period >= '202107' AND accVoucher.period <= '202107') ORDER BY accVoucher.period ASC,accVoucher.group_id ASC,accVoucher.num ASC,accVoucherEntry.line_num ASC;

 4.2.2 开启log_queries_not_using_indexes示例

        从下面可以看到虽然有的查询没有超过1s,但是因为没有使用索引,也会写入到慢日志中,另外存储过程的调用也会被记录进去。当然如果想要知道全表扫描也不一定需要这么干,可以参考mysql performance schema 实践,有语句可以直接查询到对应的数据查询没有使用索引。

        是否一定要索引,那到未必,因为有的查询使用索引,还不如直接磁盘获取。但是确实是潜在风险。所以我觉得可以先关掉,先解决1s以上查询的问题。

# Time: 2024-12-06T15:13:42.336056+08:00
# User@Host: root[root] @  [10.101.12.91]  Id: 368858
# Query_time: 0.170161  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 3049
use acc;
SET timestamp=1733469222;
CALL init_data(186360,'202107','1');
# Time: 2024-12-06T15:13:42.410030+08:00
# User@Host: root[root] @  [10.101.12.88]  Id: 368830
# Query_time: 0.003948  Lock_time: 0.000516 Rows_sent: 1  Rows_examined: 8305
use eayc;
SET timestamp=1733469222;
SELECT COUNT( * ) FROM   eayc_company_business   

        因为我们实际希望的是如下面,我调用存储过程超过1s需要记录下来

 

4.2.3 备份的时候触发的

        在慢日志中可以查到备份用户执行的语句,/*!40001 SQL_NO_CACHE */是mysql中的条件注释的语法,MySQL 不要将查询结果存储在查询缓存(Query Cache)。Mysql8.0+已经没有查询缓存,因为我的生产库用的是mysql5.7,因此还会有这个语句。

 4.2.4 update触发

        查看慢日志可以看到很多之前没有想到的问题,比如下面update问题。

# Time: 2024-12-07T17:01:34.617058+08:00
# User@Host: root[root] @  [10.101.12.88]  Id: 390876
# Query_time: 1.799098  Lock_time: 0.000085 Rows_sent: 0  Rows_examined: 2057362
SET timestamp=1733562094;
UPDATE   acc_fund_template_entry   SET status='00'   WHERE (template_id IN (42));

        这里的type是index,但是rows却有31万,肯定是有问题的。通过sql并不知道是怎么产生的,就需要开发工程师去调试代码。 

         根据业务调试,定位代码发现,多租户模式下更新没有使用账套id,问题由此修正。

        前端是传了账套id字段,但是开发工程师却忽略了。从这个问题可以看出,这些问题绝大多数测试工程师是测不出这样的问题,关注慢日志以为是运维的工作,通过慢查询可以很快知道系统的漏洞在哪里。

 

        修正后sql如下,type也到了range,同时rows也很少了。

         

5 join优化

6 order by与group by优化

6.1 order by

        原则是最好使用索引字段进行排序,但需要考虑的是索引失效的情况。mysql中有两种排序方式,①索引排序:通过有序索引顺序扫描。②额外排序(Filesort):对返回的数据进行文件排序。优化的核心自然是:尽量减少额外排序,通过索引直接返回有序数据。

        单表容易,但联表就不好操作了,因为排序时驱动表和被驱动表都会参加排序。

6.1.1 sort_buffer_size

        mysql为每个线程各维护了一个内存区域(sort buffer),用于排序。因为是面向连接,因此并不是越大越好。下面是我的配置,默认是2M。

        如果加载的记录字段的总长度小于sort buffer,则使用sort buffer;超过,则使用sort buffer+临时文件进行排序。

        下面写一个python代码计算一下217条数据,结果数据181.41KB,2M空间则可以容纳2449条凭证,基本够用。也就是说有些情况虽然explain得到了temparoy或者file sort并不一定非得着急去优化。

import pymysql
import math
def get_query_result_size(host, user, password, database, query):# 连接到数据库connection = pymysql.connect(host=host,user=user,password=password,database=database,charset='utf8mb4',  # 确保使用 utf8mb4 字符集cursorclass=pymysql.cursors.DictCursor)try:with connection.cursor() as cursor:# 执行查询cursor.execute(query)result = cursor.fetchall()# 计算结果的字节数byte_size = sum(len(str(value).encode('utf-8')) for row in result for value in row.values())return byte_sizefinally:connection.close()def convert_size(size_bytes):"""将字节数转换为合适的单位 (KB, MB, GB)"""if size_bytes == 0:return "0B"size_name = ("B", "KB", "MB", "GB", "TB")i = int(math.floor(math.log(size_bytes, 1024)))p = math.pow(1024, i)s = round(size_bytes / p, 2)return f"{s} {size_name[i]}"def getsql():return " select " \"     accVoucher.as_id as_id_accVoucher, accVoucher.id id_accVoucher, accVoucher.group_id group_id_accVoucher," \"     accVoucher.num num_accVoucher, accVoucher.period period_accVoucher, accVoucher.v_date v_date_accVoucher," \"     accVoucher.attach_num attach_num_accVoucher, accVoucher.status status_accVoucher," \"     accVoucherEntry.debit_amount_original debit_amount_original_accVoucherEntry," \"     accVoucherEntry.credit_amount_original credit_amount_original_accVoucherEntry," \"     accVoucherEntry.line_num line_num_accVoucherEntry" \"     from acc_voucher_44 accVoucher" \"     inner join acc_voucher_entry_44 accVoucherEntry on accVoucherEntry.v_id = accVoucher.id and" \"     accVoucherEntry.as_id=accVoucher.as_id" \"         WHERE (accVoucher.as_id = 281794 AND accVoucher.period >= '201108' AND accVoucher.period <= '201212') " \" ORDER BY accVoucher.period ASC,accVoucher.group_id ASC,accVoucher.num ASC,accVoucherEntry.line_num ASC"# 示例用法
if __name__ == "__main__":host = 'localhost'user = 'root'password = '123456'database = 'acc'query = getsql()size_in_bytes = get_query_result_size(host, user, password, database, query)readable_size = convert_size(size_in_bytes)print(f"Result size: {readable_size}")

6.2 group by

7 查询成本计算

相关文章:

Mysql索引原理及优化——岁月云实战笔记

根据Mysql索引原理及优化这个博主的视频学习&#xff0c;对现在的岁月云项目中mysql进行优化&#xff0c;我要向这个博主致敬&#xff0c;之前应用居多&#xff0c;理论所知甚少&#xff0c;于是将学习到东西&#xff0c;应用下来&#xff0c;看看是否有好的改观。 1 索引原理…...

AGCRN论文解读

一、创新点 传统GCN只能基于静态预定义图建模全局共享模式&#xff0c;而AGCRN通过两种GCN的增强模块&#xff08;NAPL、DAGG&#xff09;实现了更精细的节点特性学习和图结构生成。 1 节点自适应参数学习模块&#xff08;NAPL&#xff09; 传统GCN通过共享参数&#xff08;权重…...

Python机器学习笔记(五、决策树集成)

集成&#xff08;ensemble&#xff09;是合并多个机器学习模型来构建更强大模型的方法。这里主要学习两种集成模型&#xff1a;一是随机森林&#xff08;random forest&#xff09;&#xff1b;二是梯度提升决策树&#xff08;gradient boosted decision tree&#xff09;。 1…...

Kafka单机及集群部署及基础命令

目录 一、 Kafka介绍1、kafka定义2、传统消息队列应用场景3、kafka特点和优势4、kafka角色介绍5、分区和副本的优势6、kafka 写入消息的流程 二、Kafka单机部署1、基础环境2、iptables -L -n配置3、下载并解压kafka部署包至/usr/local/目录4、修改server.properties5、修改/etc…...

如何使用 Python 实现链表的反转?

在Python中实现链表的反转可以通过几种不同的方法。这里&#xff0c;我将向你展示如何使用迭代和递归两种方式来反转链表。 1. 迭代方法 迭代方法是通过遍历链表&#xff0c;逐个节点地改变其指向来实现反转的。 class ListNode: def __init__(self, val0, nextNone): …...

react跳转传参的方法

传参 首先下载命令行 npm react-router-dom 然后引入此代码 前面跳转的是页面 后面传的是你需要传的参数接参 引入此方法 useLocation()&#xff1a;这是 react-router-dom 提供的一个钩子&#xff0c;用于获取当前路由的位置对象location.state&#xff1a;这是从其他页面传…...

Scala:正则表达式

object test03 {//正则表达式def main(args: Array[String]): Unit {//定义一个正则表达式//1.[ab]:表示匹配一个字符&#xff0c;或者是a&#xff0c;或者是b//2.[a-z]:表示从a到z的26个字母中的任意一个//3.[A-Z]:表示从A到Z的26个字母中的任意一个//4.[0-9]:表示从0到9的10…...

【数电】常见时序逻辑电路设计和分析

本文目的&#xff1a;一是对真题常考题型总结&#xff0c;二是对常见时序电路设计方法进行归纳&#xff0c;给后面看这个文档的人留有一点有价值的东西。 1.不同模计数器设计 2.序列信号产生和检测电路 2.1序列信号产生电路 2.1.1设计思路 主要设计思路有三种 1&#xff09…...

Spring IOCAOP

Spring介绍 个人博客原地址 Spring是一个IOC&#xff08;DI&#xff09;和AOP框架 Sprng的优良特性 非侵入式&#xff1a;基于Spring开发的应用中的对象可以不依赖于Spring的API 依赖注入&#xff1a;DI是控制反转&#xff08;IOC&#xff09;最经典的实现 面向切面编程&am…...

Scala中的隐式转换

package qiqiobject qqqqq {//给参数设置一个默认值&#xff1a;如果用户不传入&#xff0c;就使用这个值def sayName(implicit name:String"小花"):Unit{println(s"我叫&#xff1a;$name")}//需求&#xff1a;能够自己设置函数的参数默认值,而不是在代码…...

GESP 2024年12月认证 真题 及答案

CCF GESP第八次认证将于2024年12月7日上午9:30正式开考&#xff0c;1-4级认证时间为上午9:30-11:30&#xff0c;5-8级认证时间为下午13:30-16:30。认证语言包括&#xff1a;C、 Python和图形化编程三种语言&#xff0c;其中C和Python编程为1-8级&#xff0c;图形化编程为1-4级。…...

C++多态性

概念 C中的多态性是面向对象编程的一个重要特征&#xff0c;它允许我们通过一个基类的指针或引用来操作不同派生类的对象。多态性增强了代码的灵活性和可扩展性。主要分为两种类型&#xff1a;编译时多态&#xff08;静态多态&#xff09;和运行时多态&#xff08;动态多态&am…...

PyODBC: Python 与数据库连接的桥梁

PyODBC: Python 与数据库连接的桥梁 介绍 在现代的开发环境中&#xff0c;数据是核心要素之一。几乎所有的应用程序都需要与数据库进行交互。在 Python 中&#xff0c;pyodbc 是一个非常常用的库&#xff0c;它提供了一种简便的方法&#xff0c;通过 ODBC&#xff08;开放数据…...

专题二十五_动态规划_两个数组的 dp (含字符串数组)_算法专题详细总结

目录 动态规划_两个数组的 dp &#xff08;含字符串数组&#xff09; 1. 最⻓公共⼦序列&#xff08;medium&#xff09; 解析&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a;​编辑 4. 填表顺序&#xff1a;​编辑 5. 返回值…...

PHP语法学习(第七天)-循环语句,魔术常量

老套路了&#xff0c;朋友们&#xff0c;先回忆昨天讲的内容PHP语法学习(第六天)主要讲了PHP中的if…else语句、关联数组以及数组排序。 想要学习更多PHP语法相关内容点击“PHP专栏&#xff01;” 下列代码都是在PHP在线测试运行环境中得到的&#xff01;&#xff01; 还记得电…...

数据库授权讲解一下

这条 SQL 命令是 MySQL 数据库中用于权限管理的 GRANT 语句。它用于授予用户特定的权限。下面是命令的详细解释&#xff1a; GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY Zz&#xff01;12345678 WITH GRANT OPTION;GRANT&#xff1a; 这是一个关键字&#xff0c;用于…...

组件开发的环境准备: nodejs安装,npm镜像源的修改,pnpm包管理器的安装(全局安装),基于pnpm创建脚手架项目

Node.js 是一个开源的、跨平台的 JavaScript 运行环境&#xff08;本质是Chrome引擎的封装&#xff09;,允许开发者使用 JavaScript 来编写服务器端代码 npm(Node Package Manager)是 Node.js 包管理器, 用来安装各种库、框架和工具 【Node.js官网】 https://nodejs.org 【n…...

学生成绩统计系统

实验内容 问题描述: 输入n个学生的考试成绩&#xff0c;每个学生信息由姓名与分数组成;试设计一种算法: (1)按分数高低次序&#xff0c;打印出每个学生的名次&#xff0c;分数相同的为同一名次; (2)按名次输出每个学生的姓名与分数。 基本要求: (1)学生的考试成绩必须通过…...

【Spring项目】图书管理系统

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;项目实现准备 1&#xff1a;需求 &#xff08;1&#xff09;登录 2&#xff1a;准备…...

Vivado ILA数据导出MATLAB分析

目录 ILA数据导出 分析方式一 分析方式二 有时候在系统调试时&#xff0c;数据在VIVADO窗口获取的信息有限&#xff0c;可结合MATLAB对已捕获的数据进行分析处理 ILA数据导出 选择信号&#xff0c;单击右键后&#xff0c;会有export ILA DATA选项&#xff0c;将其保存成CS…...

【开源免费】基于SpringBoot+Vue.JS高校学科竞赛平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 075 &#xff0c;文末自助获取源码 \color{red}{T075&#xff0c;文末自助获取源码} T075&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...

【机器学习】——windows下安装anaconda并在vscode上进行配置

一、安装anaconda 1.进入清华的镜像网站&#xff0c;下载自己电脑对应的anaconda版本。网站&#xff1a;https://repo.anaconda.com/archive/ 这里我下载的版本是anaconda3-2024.10-1-Windows-x86-64 2.下载完毕后开始安装anaconda 3.配置anaconda环境变量 在设置中找到编…...

【H2O2|全栈】Node.js与MySQL连接

目录 前言 开篇语 准备工作 初始配置 创建连接池 操作数据库 封装方法 结束语 前言 开篇语 本节讲解如何使用Node.js实现与MySQL数据库的连接&#xff0c;并将该过程进行函数封装。 与基础部分的语法相比&#xff0c;ES6的语法进行了一些更加严谨的约束和优化&#…...

汽配行业数字化解决方案(一)

汽配行业数字化解决方案&#xff0c;是通过整合云计算、大数据、人工智能、物联网等先进技术&#xff0c;构建一个全面、高效、智能的数字化生态系统&#xff0c;以实现汽配供应链的全程可视化与智能化管理。该解决方案涵盖了从供应商管理、库存优化、订单处理、物流跟踪到客户…...

前端路径“@/“的使用和配置

环境&#xff1a;vitets 需要安装types/node npm install types/node --save-dev在tsconfig.json中添加 如果有tsconfig.app.json和tsconfig.node.json文件&#xff0c;则在app.json中添加 "compilerOptions": {"baseUrl":".","paths&q…...

动态规划子序列问题系列一>最长递增子序列

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int lengthOfLIS(int[] nums) {int n nums.length;int[] dp new int[n];int ret 1;//最坏情况为1//初始化for(int i 0; i < n; i) dp[i] 1;for(int i 1; i < n; i){for(int j 0; j < i-1; j)if(…...

链表头文件大更新!!!

引言 原文章:链表简介及自制链表操作头文件_自己写一个链表头文件-CSDN博客。 此次更新添加了更多功能&#xff0c;让改头文件更 人性化 。 安装教程见原文章。 介绍 linked_list.h 头文件 linked_list.h 是一个 C 头文件&#xff0c;定义了一个模板类 LinkedList&#xff…...

力扣3381.长度可被K整除的子数组的最大元素和

力扣3381.长度可被K整除的子数组的最大元素和 题目 题目解析及思路 题目要求返回一段长度为K的倍数的最大子数组和 同余前缀和 代码 class Solution { public:long long maxSubarraySum(vector<int>& nums, int k) {int n nums.size();vector<long long>…...

http.ServeMux多路复用器的设置

package mainimport ("fmt""net/http" )func first(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-first") }func second(w http.ResponseWriter, r *http.Request) {fmt.Fprintln(w, "多函数-second") }func ma…...

优化器与优化方法:在现代科学与工程中的应用

目录 ​编辑 优化器&#xff1a;机器学习中的参数调整 1. 梯度下降系列 2. 动量法&#xff08;Momentum&#xff09; 3. Adagrad 4. RMSprop 5. Adam 优化方法&#xff1a;寻找系统最优解 线性规划 非线性规划 凸优化 非凸优化 结论 在当今的科学和工程领域&#…...