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

MySQL8.0 optimizer_switch变化

Optimizer_switch变量是支持对优化器行为的控制。是一组值标志,每个标志都有一个on或off的值,以指示是否启用或禁用相应的行为。

MySQL8.0里除了熟悉的hash join重大变化之外,其他方面也有优化。

mysql> SHOW VARIABLES LIKE 'OPTIMIZER_SWITCH'\G;
*************************** 1. row ***************************
Variable_name: optimizer_switchValue: index_merge=on,index_merge_union=on,index_merge_sort_union=on,
index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,
mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,
materialization=on,semijoin=on,loosescan=on,firstmatch=on,
duplicateweedout=on,subquery_materialization_cost_based=on,
use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,##下面是目前5.7 Vs 8.0差异内容##
use_invisible_indexes=off,skip_scan=on,hash_join=on,
subquery_to_derived=off,prefer_ordering_index=on,
hypergraph_optimizer=off,derived_condition_pushdown=on

use_invisible_indexes

MySQL8.0 开始支持隐藏索引,有时往往因为索引不合理,执行计划太差,需要大动干戈,现在不需要进行破坏性的更改,优化器方面配合是否使用不可见索引来构建查询执行计划.默认是关闭。当然这里主键以外。

#索引age隐藏
mysql> ALTER TABLE members  ALTER INDEX idx_age INVISIBLE;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0#执行计划全表扫描
mysql> EXPLAIN select *from members where age > 10;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | members | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)#优化器可用隐藏索引打开。
mysql> SET SESSION optimizer_switch='use_invisible_indexes=on';
Query OK, 0 rows affected (0.00 sec)#执行计划使用age 隐藏索引
mysql> EXPLAIN select *from members where age > 10;
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | members | NULL       | range | idx_age       | idx_age | 5       | NULL |    3 |   100.00 | Using index condition |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

备注: 在一些业务无法及时改变SQL语句的时,可以通过更改索引隐藏属性,有效控制手段。
特别是生产不确定索引性能影响的时候,可以在线操作,算是应急对策。

prefer_ordering_index

MySQL里对任何有LIMIT子句的ORDER BY或GROUP BY查询使用有序索引,覆盖优化器所做的任何其他选择,只要它确定这会导致更快的执行。因此做出这种判断的算法对数据分布和其他条件做出了某些假设,所以它可能并不总是完全正确,而且在某些情况下,此类查询选择不同的优化可能会提供更好的性能。
8.0.21版本中optimizer_switch变量的prefer_ordering_index设置来禁用这种优化算法。

optimizer_switch参数中的prefer_ordering_index进行控制对于order by limit的优化。prefer_ordering_index默认打开,表示MySQL会优先考虑通过order by列索引进行排序优化。

目前验证发现只在范围查询中,有算法干扰。所以使用范围查询,可要小心了。

#模拟表结构和数据
mysql>CREATE table `members`  
( 
id int unsigned NOT NULL AUTO_INCREMENT , 
first_name varchar(100)  DEFAULT  NULL  , 
last_name  varchar(100) DEFAULT NULL ,  
age  INT  DEFAULT '0' ,  
create_time   timestamp  DEFAULT CURRENT_TIMESTAMP,  
update_time timestamp   DEFAULT current_timestamp() ON UPDATE current_timestamp(),
primary KEY (id) ,
KEY idx_first_last(first_name(3),last_name(3)),
KEY idx_age(age)
);
mysql>INSERT INTO `members`(id,first_name,last_name,age)  VALUES(1,'AAAAA','BBBBB',12),(2,'AAAAA','CCCCC',20),(3,'DDDDD','EEEEE',30);#排序优先开启
mysql>SET  optimizer_switch = "prefer_ordering_index=on";#优先ORDER BY 和 LIMIT 选择主键
mysql> EXPLAIN  SELECT  * FROM  members   WHERE   age> 15  order by `id` DESC LIMIT 1;
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                            |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+
|  1 | SIMPLE      | members | NULL       | index | idx_age       | PRIMARY | 4       | NULL |    1 |    66.67 | Using where; Backward index scan |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------+
1 row in set, 1 warning (0.00 sec)#排序优先关闭
mysql> SET  optimizer_switch = "prefer_ordering_index=off";
Query OK, 0 rows affected (0.00 sec)#选择合理执行计划
mysql> EXPLAIN  SELECT  * FROM  members   WHERE   age> 15  order by `id` DESC LIMIT 1;
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+---------------------------------------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                                 |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+---------------------------------------+
|  1 | SIMPLE      | members | NULL       | range | idx_age       | idx_age | 5       | NULL |    2 |   100.00 | Using index condition; Using filesort |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+---------------------------------------+
1 row in set, 1 warning (0.00 sec)

subquery_to_derived

MySQL 8.0.21开始,优化器增加了subquery_to_derived(默认关闭)选项。优化器在许多情况下能够将SELECT、WHERE、JOIN或HAVING子句中的标量子查询转换为派生表上的左&外部连接(在某些情况下是内连接)。
所为的:

  • subquery: 包含在 SELECT 中的子查询(不在 FROM子句中)。
  • derived : 包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,
    也称为派生表(derived).

在大多数情况下,启用此优化不会产生任何明显的性能改进(在许多情况下甚至会使查询运行得更慢),视情况而定,所以选择默认值即可。

SHOW WARNINGS信息下,可以看到语句改写情况:

mysql> SET SESSION optimizer_switch='subquery_to_derived=OFF';
Query OK, 0 rows affected (0.00 sec)mysql> EXPLAIN SELECT * FROM t1   WHERE t1.a > (SELECT COUNT(a) FROM t2);
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | PRIMARY     | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    33.33 | Using where |
|  2 | SUBQUERY    | t2    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL        |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                 |
+-------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1003 | /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` 
where (`test`.`t1`.`a` > (/* select#2 */ select count(`test`.`t2`.`a`) from `test`.`t2`)) |
+-------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SET SESSION optimizer_switch='subquery_to_derived=ON';
Query OK, 0 rows affected (0.00 sec)mysql> EXPLAIN SELECT * FROM t1   WHERE t1.a > (SELECT COUNT(a) FROM t2);
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+
| id | select_type | table      | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                      |
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL                                       |
|  1 | PRIMARY     | t1         | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    33.33 | Using where; Using join buffer (hash join) |
|  2 | DERIVED     | t2         | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL                                       |
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+
3 rows in set, 1 warning (0.00 sec)mysql>  SHOW WARNINGS;;
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                           |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1003 | /* select#1 */ select `test`.`t1`.`a` AS `a` 
from `test`.`t1` join (
/* select#2 */ select count(`test`.`t2`.`a`) AS `COUNT(a)` 
from `test`.`t2`) `derived_1_2` 
where (`test`.`t1`.`a` > `derived_1_2`.`COUNT(a)`) |
+-------+------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

derived_condition_pushdown

Mysql 8.0.22之后的版本支持派生条件回移(Derived Condition Pushdown)优化。该优化可以减少derived派生表处理的行数从而提高查询执行的效率。

比方如下查询:

SELECT * FROM 
(SELECT i, j FROM t1) AS dt 
WHERE i > constant# ↓ ↓ ↓ 通过派生条件回移优化后类似如下形式(WHERE条件拿到派生表的里面)SELECT * FROM (SELECT i, j FROM t1 WHERE i > constant)

就是说 将外部WHERE条件下推到派生表中应该会减少需要处理的行数,从而加快查询的执行速度。

MySQL 8.0.29及以后版本中,派生表条件下推优化可以用于UNION查询。
不能下推情况:内部表,包含子查询的条件,公共表表达式,LIMIT子句,变量的赋值 等场景。

skip_scan

MySQL从8.0.13版本开始支持一种新的range scan方式。就是说 组合索引(f1,f2)的时候,查询条件里 只有f2的时候 也可以实现索引扫描的功能.范围扫描比全索引扫描更有效,优化器可以执行多个范围扫描,每个值对应一个f1,使用一种称为Skip Scan的方法,类似于松散索引扫描。

从上述描述可以看到使用skip-scan的方式避免了全索引扫描,从而提升了性能,尤其是在索引前缀列区分度比较低的时候。可以说 避开了索引前缀原则。

mysql> ALTER TABLE t1 ADD PRIMARY KEY(f1, f2);
Query OK, 0 rows affected (0.11 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> EXPLAIN SELECT f1, f2 FROM t1 WHERE f2 > 40;;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                                  |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------------+
|  1 | SIMPLE      | t1    | NULL       | range | PRIMARY       | PRIMARY | 8       | NULL |   53 |   100.00 
| Using where; Using index for skip scan |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+----------------------------------------+
1 row in set, 1 warning (0.00 sec)

hypergraph_optimizer

MySQL 8.0.23提供了优化器支持hypergraph(超图)的模型。目前实际还不支持,需要在debug下进行验证测试,是不成熟的优化方案。

hypergraph是数学中用的概念。在数据算法中,描述对象之间建立联系而用的。个人理解,就是通过边界算法,把对应的数据关联点,范围等圈出来。

由此多表关联下,从5.7的nest loop 进化到8.0的hash join,在hash join进一步提升效率的的算法。这个算法非常切合B+Tree配合使用。

mysql> SET SESSION optimizer_switch='hypergraph_optimizer=ON';
ERROR 3999 (42000): The hypergraph optimizer does not yet support 'use in non-debug builds'

总结

优化器行为变更,可能会导致不同版本SQL语句性能体现不一样。当然变化是往好的方面延伸的,但对于复杂的情况,可能也会出现退化效果。所以版本升级的时候,需要特别关注下。

在这里特别感兴趣hypergraph(超图)优化方案。因为MySQL对于多表关联是一个致命的问题,关联表数量越多性能越差。对于hypergraph的算法本质上的理解,可以说结合B+Tree性能提升空间很大。

相关文章:

MySQL8.0 optimizer_switch变化

Optimizer_switch变量是支持对优化器行为的控制。是一组值标志&#xff0c;每个标志都有一个on或off的值&#xff0c;以指示是否启用或禁用相应的行为。 MySQL8.0里除了熟悉的hash join重大变化之外&#xff0c;其他方面也有优化。 mysql> SHOW VARIABLES LIKE OPTIMIZER_…...

Web--Maven

1.maven管理项目的区别 2. 安装后&#xff0c;conf目录下的setting文件中&#xff0c;对本地仓库的配置 此处可替换成自定义的本地仓库地址&#xff0c;默认为c:/user/17860/.m2/repository(我的电脑上的&#xff09; 3.maven项目的标准目录结构 4.项目的生命周期 5.Maven概…...

深入理解MySQLⅢ -- 锁与InnoDB引擎

文章目录锁概述全局锁表级锁表锁元数据锁意向锁行级锁行锁间隙锁&临键锁InnoDB引擎逻辑存储结构架构内存结构磁盘结构后台线程事务原理redo logundo logMVCC锁 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#x…...

Win11电脑速度慢、延迟高怎么办?

作为新版的系统&#xff0c;Windows 11还需要更多的时间完善。不少用户反映升级了Win11后反而感觉速度慢&#xff0c;还有延迟或死机现象。 如果你使用Win11系统时也有这种感觉&#xff0c;那这篇文章就是为你提供的。 问题可能出在系统存储容量低、驱动程序已过时&#xff0…...

【双指针问题】977. 有序数组的平方

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…...

Meta AR眼镜主管:正开发史无前例的AR,但要解决很多困难

前不久&#xff0c;Meta CTO Andrew Bosworth在个人博客上“怒斥”公司内部不够专注&#xff0c;应该将资源投入在有核心竞争力、高投资回报率的业务上&#xff0c;而不是开发取悦用户却不赚钱的产品。尽管删除一些小众功能后&#xff0c;用户可能会不满&#xff0c;但为了让Me…...

Docker 搭建KingbaseES主备流复制

author: aming email: jikcheng163.com title: Docker 安装KingbaseES读写分离集群 creation_date: 2023-02-16 13:59 Last modified date: 2023-02-16 19:18 tags: Docker 安装KingbaseES读写分离集群 File Folder with relative path: reading notes/doc/Docker技术入门与实战…...

java易错题锦集四

effective java 不要再构造方法中启动任何线程 g new GameServer(); g.start();构造器无返回值&#xff0c;但是不能void修饰 字符串 String是包装类型吗&#xff1f;答案&#xff1a; 不是 对应的基本类型和包装类如下表&#xff1a; 基本数据类型 包装类 byte Byte bool…...

每天10个前端小知识 【Day 17】

前端面试基础知识题 1.使用原生js实现以下效果&#xff1a;点击容器内的图标&#xff0c;图标边框变成border:1px solid red&#xff0c;点击空白处重置 const box document.getElementById(box); function isIcon(target) { return target.className.includes(icon); } b…...

Python语言零基础入门教程(二十三)

16、Python os.fpathconf() 方法 概述 os.fpathconf() 方法用于返回一个打开的文件的系统配置信息。 Unix上可用。 语法 fpathconf()方法语法格式如下&#xff1a; os.fpathconf(fd, name)参数 fd – 打开的文件的描述符。 name – 可选&#xff0c;和buffersize参数和Pyt…...

[ansible系列]ansible使用扩展

目录 一. 本地执行 二. 任务委托 三. 任务暂停 四. 滚动执行 五. 只执行一次 六. 设置环境变量 七. 交互提示 一. 本地执行 我们知道ansible的是操作被控端的&#xff0c;所有执行的动作都是在被控端上完成的&#xff0c;当然在某些特定的时候我们想要有些tas…...

Java工具类(时间格式转换)

import java.util.Date; import java.text.DateFormat; /** * 格式化时间类 * DateFormat.FULL 0 * DateFormat.DEFAULT 2 * DateFormat.LONG 1 * DateFormat.MEDIUM 2 * DateFormat.SHORT 3 * author Michael * version 1.0&#xff0c; 2007/03/09 */ public c…...

数据库(第五次作业)

1.1 Redis概述 1.1.1 什么是Redis 2008年&#xff0c;意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG&#xff0c;然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL的性能感到失望&#xff0c;于是他决定亲自为LLOOGG量身定做一个数据…...

代码随想录【Day16】| 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和

110. 平衡二叉树 题目链接 题目描述&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,nul…...

套娃式工具!用 AI 识别 AI ?#AI classifier

2022年以来&#xff0c;市面上就出现了不少 AI 生成文本的工具&#xff0c;尤其是 OpenAI 推出的 ChatGPT &#xff0c;不仅能够协助完成撰写邮件、视频脚本、文案、翻译、代码等任务&#xff0c;还能通过学习和理解人类的语言来进行对话&#xff0c;并根据聊天的上下文进行互动…...

CURL error 60: SSL certificate problem: certificate has expired

项目使用guzzleHttp做的一个接口&#xff0c;报错&#xff1a;certificate has expired 因为在linux centos环境与window环境有所不同&#xff0c;在此记录一下解决过程。 目录 报错提示 原因 解决方式 1.去掉guzzlehttp的验证 2.更新CA证书 总结 报错提示 cURL error 60…...

接口自动化:requests

引言&#xff1a;目前软件测试对测试人员的能力要求 业务测试能力&#xff1a;占比5-6成接口、自动化、性能测试能力&#xff1a;占比4-5成流程规范&#xff1a;1成&#xff08;需要综合型的测试人才&#xff09;&#xff1a;业务能力、代码能力、开发思维&#xff08;封装&…...

极简TypeScript教程--数据类型

TypeScript最大的特点就是有类型检测&#xff0c;格式为let/const 标识符: 数据类型 赋值;例子:let msg: string Hello World这样msg这个变量就有了字符串类型,如果再给他赋值为数字类型&#xff0c;就会在编译期报错。变量的类型推导在开发中&#xff0c;有时候为了方便起见…...

JAVA开发测试(jmeter如何测试性能与估算)

对C的业务网站或应用&#xff0c;进行性能测试来评估使用服务器情况是必不可少的一项工作。 一、测试工具&#xff1a; Apache JMeter 可以用于对服务器、网络或对象模拟巨大的负载&#xff0c;来自不同压力类别下测试它们的强度和分析整体性能&#xff0c;是Apache组织开发的…...

【新解法】华为OD机试 - 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供

华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 求解连续数列 | 备考思路,刷题要点,答疑,od Base 提供 题目 已知连续正整数数列{K}=K1,K2,K3… Ki的各个数相加之和为S, i = N (0 < S < 100000, 0 < N < 100000), 求此数列K。 输入 输…...

Python3 File(文件) 方法

Python3 File(文件) 方法 open() 方法 Python open() 方法用于打开一个文件&#xff0c;并返回文件对象。 在对文件进行处理过程都需要使用到这个函数&#xff0c;如果该文件无法被打开&#xff0c;会抛出 OSError。 注意&#xff1a;使用 open() 方法一定要保证关闭文件对…...

APP渗透抓包

APP渗透抓包1.APP渗透测试原理2.安装安卓模拟器抓包2.1.安装模拟器2.2.设置代理下载证书2.2.1.burp suite设置代理2.2.2.浏览器设置代理2.2.3.下载证书2.3.模拟器安装证书2.3.1.移动证书2.3.2.证书设置2.4.设置代理2.4.1.设置burp suite代理2.4.2.夜神模拟器代理2.5.抓包测试2.…...

力扣(LeetCode)414. 第三大的数(2023.02.16)

给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;第三大的数是 1 。 示例 2&#xff1a; 输入&#xff1a;[1, 2] 输出&#xff1a;2…...

Spring底层

一、什么是Spring&#xff1f;谈谈你对IOC和AOP的理解。Spring&#xff1a; 是一个企业级java应用框架&#xff0c;他的作用主要是 简化软件的开发以及配置过程&#xff0c;简化项目部署环境。Spring的有点&#xff1a;1、Spring低侵入设计&#xff0c;对业务代码的污染非常低。…...

Cache-Control 常见字段

Cache-Control 常见字段 参考&#xff1a;https://blog.csdn.net/qq_41996454/article/details/108644436 Cache-Control 可以在请求头或者响应头中设置&#xff0c;并且可以组合使用多种指令 no-cache 和 no-store 用作控制缓存&#xff0c;被服务器通过响应头 Cache-Contro…...

Flink Checkpoint 中的通用增量Checkpoint

文章目录知识点状态Flink容错恢复周期性的 Checkpoint错误检测 Failure Detected重新调度 Re-scheduling状态恢复 State Recovery通用增量Checkpoint知识点 状态 算子需要记录之前数据处理的中间结果&#xff0c;把中间结果暂时缓存在算子的内部&#xff0c;这就是算子的状态…...

金三银四必看的软件测试面试题宝典,背完offer随便拿

怎么来设计测试方案根据测试需求&#xff08;包括功能需求和非功能性需求&#xff09;&#xff0c;识别测试要点&#xff0c;识别测试环境要求&#xff0c;安排测试轮次&#xff0c;根据项目计划和开发计划做整体的测试安排。 被测试的特性&#xff1a;通过对需求规格说明书进行…...

企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

扬帆优配“数字经济+实体经济”融合发展,行业增长空间大!

组织以为&#xff0c;数字经济已经逐步成为工业商场和资本商场的共同主题。 2月16日&#xff0c;国家发改委在《求是》杂志发表文章《努力推进经济完成质的有效提升和量的合理增加》。文章指出要加速开展数字经济&#xff0c;加速实施“东数西算”等重大工程&#xff0c;推进数…...

分享82个HTML电脑主机模板,总有一款适合您

分享82个HTML电脑主机模板&#xff0c;总有一款适合您 82个HTML电脑主机模板下载链接&#xff1a;https://pan.baidu.com/s/13DGOCgvbxSksMPwJzi2z0g?pwdl0mi 提取码&#xff1a;l0mi Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 云虚拟主机运营商网站模板…...

专门做产品推广ppt的网站/鹤壁seo

2014年初&#xff0c;4G联网首次进入汽车前装市场&#xff0c;同一年&#xff0c;通讯及手机芯片厂商高通公司首次推出骁龙602A处理器&#xff0c;开启汽车联网信息娱乐服务新纪元。 两年后&#xff0c;高通发布了全新的信息娱乐系统处理器骁龙820A&#xff0c;和骁龙602A相比…...

枣庄专业做网站/seo优化的价格

链接&#xff1a;https://ac.nowcoder.com/acm/contest/330/E 来源&#xff1a;牛客网 题目描述 精通程序设计的 Applese 叕写了一个游戏。 在这个游戏中&#xff0c;有一个 n 行 m 列的方阵。现在它要为这个方阵涂上黑白两种颜色。规定左右相邻两格的颜色不能相同。请你帮它统…...

福田莲花北网站建设/个人博客网页设计

1. 悲观锁与乐观锁我们都知道&#xff0c;cpu是时分复用的&#xff0c;也就是把cpu的时间片&#xff0c;分配给不同的thread/process轮流执行&#xff0c;时间片与时间片之间&#xff0c;需要进行cpu切换&#xff0c;也就是会发生进程的切换。切换涉及到清空寄存器&#xff0c;…...

深圳俄语网站建设/关键词推广优化app

题目5&#xff1a;消除类游戏 问题描述   消除类游戏是深受大众欢迎的一种游戏&#xff0c;游戏在一个包含有n行m列的游戏棋盘上进行&#xff0c;棋盘的每一行每一列的方格上放着一个有颜色的棋子&#xff0c;当一行或一列上有连续三个或更多的相同颜色的棋子时&#xff0c;…...

类似wordpress的工具/搜索引擎网址

1. 问题描述一个头文件mine.h&#xff0c;两个.cpp都include该mine.h&#xff0c;而且两个.cpp文件都要多次使用同一个常量数组array。2. 尝试过的失败方法&#xff08;1&#xff09;在头文件mine.h中定义全局数组array&#xff0c;出现重复定义的链接build错误。&#xff08;2…...

外贸优秀网站/网站关键字排名优化

括号匹配 #include<iostream> #include<string> #include<stack>using namespace std; string st; bool isLeft(char c)//判断是否为左括号 {if(c(||c{||c[) return true;else return false; } bool isSame(char c1,char c2) //判断括号是否是同等类型 {if(…...