MySQL复杂查询优化实战:从多表关联到子查询的性能突破
文章目录
- 一、复杂查询性能瓶颈分析与优化框架
- 二、多表关联查询的优化策略与实战
- 1. JOIN顺序优化:基于成本估算的表关联策略
- 2. 复合索引与JOIN条件优化
- 3. 大表JOIN的分片处理
- 三、子查询优化:从嵌套到JOIN的转换艺术
- 1. 标量子查询转换为JOIN
- 2. EXISTS子查询与IN子查询的选择与优化
- 3. WITH RECURSIVE优化递归子查询
- 四、索引与统计信息的深度优化
- 1. 覆盖索引与前缀索引的应用
- 2. 统计信息更新与直方图优化
- 五、复杂查询的分拆与缓存策略
- 1. 大查询分拆为多个小查询
- 2. 结果缓存与查询缓存策略
- 六、实战案例:电商系统复杂查询优化全流程
- 场景:查询"近30天内购买过TOP10热销商品的用户及其复购率"
- 七、总结:复杂查询优化的核心原则
一、复杂查询性能瓶颈分析与优化框架
在实际业务场景中,MySQL查询性能问题往往源于多表关联(JOIN)和子查询的不当使用。以电商订单系统为例,当需要查询"近30天内购买过电子产品的用户及其订单详情"时,若直接使用嵌套子查询或无序JOIN,可能导致查询耗时从毫秒级飙升至秒级。这类问题的核心矛盾在于:数据库引擎对复杂查询的执行计划生成存在天然局限性,需要通过人为干预优化执行路径。
优化的核心框架可拆解为三步:
- 定位性能痛点:通过
EXPLAIN
分析执行计划,识别Using filesort
、Using temporary
等低效操作 - 重构查询结构:将子查询转换为JOIN、调整表关联顺序、拆分复杂查询
- 索引与统计信息优化:建立复合索引、更新表统计信息
二、多表关联查询的优化策略与实战
1. JOIN顺序优化:基于成本估算的表关联策略
MySQL的JOIN执行遵循"嵌套循环连接"(Nested Loop Join)机制,驱动表的选择直接影响IO次数。以订单表、用户表、商品表的三表关联为例:
-- 原始查询:错误的JOIN顺序导致全表扫描
EXPLAIN SELECT o.order_id, u.username, p.product_name
FROM orders o
JOIN users u ON o.user_id = u.user_id
JOIN products p ON o.product_id = p.product_id
WHERE o.create_time > '2025-05-20' AND p.category = '电子产品';-- 优化后:先过滤再关联,以orders表为驱动表
EXPLAIN SELECT o.order_id, u.username, p.product_name
FROM orders o
-- 先对orders表建立时间索引
WHERE o.create_time > '2025-05-20'
JOIN users u ON o.user_id = u.user_id
JOIN products p ON o.product_id = p.product_id AND p.category = '电子产品';
执行计划对比:
优化前:orders表扫描10万行,users和products表均全表扫描,总IO约20万次
优化后:orders表通过索引过滤至1万行,users和products表通过主键关联,总IO降至1.2万次
2. 复合索引与JOIN条件优化
当JOIN条件涉及多个字段时,复合索引的顺序至关重要。以订单明细表与商品表的关联为例:
-- 表结构
CREATE TABLE order_items (order_id INT,product_id INT,quantity INT,-- 错误的索引顺序:未按JOIN条件顺序创建KEY idx_order_product (order_id, product_id)
);CREATE TABLE products (product_id INT PRIMARY KEY,category VARCHAR(50),price DECIMAL(10,2)
);-- 低效查询:JOIN条件与索引顺序不一致
EXPLAIN SELECT oi.order_id, p.category
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id AND oi.order_id = 12345;-- 优化方案:重建复合索引并调整JOIN条件顺序
ALTER TABLE order_items DROP KEY idx_order_product;
ALTER TABLE order_items ADD KEY idx_product_order (product_id, order_id);-- 优化后查询:条件顺序与索引一致
EXPLAIN SELECT oi.order_id, p.category
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id AND oi.order_id = 12345;
索引原理解析:
复合索引idx_product_order
按product_id
和order_id
排序,当查询条件为product_id = ? AND order_id = ?
时,可直接通过B+树定位,避免回表查询。而原索引idx_order_product
在查询时只能利用order_id
过滤,product_id
条件需二次扫描。
3. 大表JOIN的分片处理
当关联表数据量超过千万级时,直接JOIN可能导致内存溢出。可采用"分批次JOIN"策略,以日志表与用户表的关联为例:
-- 原始查询:千万级日志表与百万级用户表直接JOIN
EXPLAIN SELECT l.user_id, u.username, COUNT(l.id) as log_count
FROM user_logs l
JOIN users u ON l.user_id = u.user_id
WHERE l.log_time > '2025-01-01'
GROUP BY l.user_id;-- 优化方案:分批次查询用户ID再关联
-- 1. 先查询符合条件的用户ID范围
SELECT user_id INTO @min_id FROM users ORDER BY user_id LIMIT 1;
SELECT user_id INTO @max_id FROM users ORDER BY user_id DESC LIMIT 1;-- 2. 定义批次大小
SET @batch_size = 10000;
SET @current_id = @min_id;-- 3. 循环分批次查询
CREATE TEMPORARY TABLE temp_results (user_id INT,username VARCHAR(50),log_count INT
);WHILE @current_id < @max_id DOINSERT INTO temp_resultsSELECT l.user_id, u.username, COUNT(l.id)FROM user_logs lJOIN users u ON l.user_id = u.user_idWHERE l.log_time > '2025-01-01'AND u.user_id BETWEEN @current_id AND @current_id + @batch_size - 1GROUP BY l.user_id;SET @current_id = @current_id + @batch_size;
END WHILE;-- 4. 输出最终结果
SELECT * FROM temp_results;
性能对比:
直接JOIN:耗时120秒,内存占用峰值2.8GB
分批次JOIN:总耗时28秒,单次批次内存占用<500MB
三、子查询优化:从嵌套到JOIN的转换艺术
1. 标量子查询转换为JOIN
标量子查询(返回单个值)常见于"查询订单中金额最高的商品"场景,但其嵌套查询结构会导致多次执行:
-- 原始标量子查询:每次查询都触发子查询
SELECT order_id, product_id, price,(SELECT MAX(price) FROM order_items WHERE order_id = o.order_id) as max_price
FROM order_items o
WHERE order_id IN (1001, 1002, 1003);-- 优化方案:转换为自JOIN
SELECT o1.order_id, o1.product_id, o1.price, o2.max_price
FROM order_items o1
JOIN (SELECT order_id, MAX(price) as max_priceFROM order_itemsGROUP BY order_id
) o2 ON o1.order_id = o2.order_id
WHERE o1.order_id IN (1001, 1002, 1003);
执行计划分析:
子查询版本:外层查询3行,每行触发一次子查询(扫描100行/次),总扫描300行
JOIN版本:子查询先聚合生成临时表(3行),再与主表JOIN,总扫描103行
2. EXISTS子查询与IN子查询的选择与优化
在"查询有未支付订单的用户"场景中,EXISTS与IN的选择直接影响性能:
-- 场景:users表10万行,orders表100万行
CREATE TABLE users (user_id INT PRIMARY KEY, username VARCHAR(50));
CREATE TABLE orders (order_id INT, user_id INT, status VARCHAR(20), KEY idx_user_status (user_id, status));-- 错误用法:IN子查询导致全表扫描
SELECT u.user_id, u.username
FROM users u
WHERE u.user_id IN (SELECT o.user_id FROM orders o WHERE o.status = '未支付'
);-- 优化方案:EXISTS结合索引
SELECT u.user_id, u.username
FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.user_id AND o.status = '未支付'
);-- 更优方案:JOIN + 聚合
SELECT u.user_id, u.username
FROM users u
JOIN orders o ON u.user_id = o.user_id AND o.status = '未支付'
GROUP BY u.user_id, u.username;
性能测试数据:
IN子查询:耗时18秒,扫描orders表100万行
EXISTS子查询:耗时3.2秒,利用idx_user_status
索引扫描20万行
JOIN方案:耗时1.8秒,通过索引过滤后JOIN结果集10万行
3. WITH RECURSIVE优化递归子查询
在处理层级数据(如部门架构)时,递归子查询可能导致性能骤降,可通过CTE(Common Table Expression)优化:
-- 原始递归子查询:查询部门及其所有子部门
SELECT dept_id, parent_id, dept_name
FROM departments
WHERE dept_id = 1001
UNION ALL
SELECT d.dept_id, d.parent_id, d.dept_name
FROM departments d
JOIN (SELECT dept_id, parent_id, dept_nameFROM departmentsWHERE dept_id = 1001
) sub ON d.parent_id = sub.dept_id;-- 优化方案:WITH RECURSIVE CTE
WITH RECURSIVE dept_hierarchy AS (-- 初始查询:根部门SELECT dept_id, parent_id, dept_name, 1 as levelFROM departmentsWHERE dept_id = 1001UNION ALL-- 递归查询:子部门SELECT d.dept_id, d.parent_id, d.dept_name, dh.level + 1FROM departments dJOIN dept_hierarchy dh ON d.parent_id = dh.dept_id
)
SELECT * FROM dept_hierarchy;
执行效率对比:
原始递归:耗时7.5秒,重复扫描父部门数据
CTE优化:耗时1.2秒,利用CTE缓存中间结果,避免重复查询
四、索引与统计信息的深度优化
1. 覆盖索引与前缀索引的应用
当查询字段可完全通过索引获取时,覆盖索引可避免回表查询。以订单查询为例:
-- 原始查询:需要回表查询
EXPLAIN SELECT order_id, create_time, total_amount
FROM orders
WHERE user_id = 1234 AND create_time > '2025-05-01';-- 优化方案:创建覆盖索引
ALTER TABLE orders ADD KEY idx_user_time_amount (user_id, create_time, total_amount);-- 优化后执行计划:Using index(覆盖索引)
EXPLAIN SELECT order_id, create_time, total_amount
FROM orders
WHERE user_id = 1234 AND create_time > '2025-05-01';
对于长文本字段(如商品描述),前缀索引可在空间与性能间取得平衡:
-- 创建前缀索引(取前100个字符)
ALTER TABLE products ADD KEY idx_desc_prefix (description(100));-- 查询包含"人工智能"的商品
SELECT product_id, name
FROM products
WHERE description LIKE '%人工智能%';
2. 统计信息更新与直方图优化
MySQL的查询优化器依赖表统计信息生成执行计划,过时统计信息会导致错误决策:
-- 场景:订单表新增90%的"电子产品"订单,但统计信息未更新
-- 错误执行计划:选择全表扫描而非索引
EXPLAIN SELECT * FROM orders WHERE category = '电子产品';-- 优化方案:更新表统计信息
ANALYZE TABLE orders;-- 高级优化:为category字段创建直方图
ALTER TABLE orders SET STATISTICS_PERSISTENT=ON;
ANALYZE TABLE orders UPDATE HISTOGRAM ON category;
五、复杂查询的分拆与缓存策略
1. 大查询分拆为多个小查询
当单个查询涉及超过5张表关联时,可拆分为多个子查询分步执行:
-- 原始复杂查询:五表关联
SELECT o.order_id, u.username, p.product_name, c.category_name, s.status_name
FROM orders o
JOIN users u ON o.user_id = u.user_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
JOIN categories c ON p.category_id = c.category_id
JOIN order_status s ON o.status_id = s.status_id
WHERE o.create_time > '2025-06-01';-- 优化方案:分三步查询
-- 1. 查询订单基本信息
CREATE TEMPORARY TABLE temp_orders AS
SELECT order_id, user_id, status_id, create_time
FROM orders
WHERE create_time > '2025-06-01';-- 2. 关联用户和状态表
CREATE TEMPORARY TABLE temp_orders_users AS
SELECT o.order_id, u.username, s.status_name
FROM temp_orders o
JOIN users u ON o.user_id = u.user_id
JOIN order_status s ON o.status_id = s.status_id;-- 3. 关联商品和分类表
SELECT o.order_id, u.username, p.product_name, c.category_name, o.status_name
FROM temp_orders_users o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id
JOIN categories c ON p.category_id = c.category_id;
2. 结果缓存与查询缓存策略
对于高频低变的查询,可利用MySQL查询缓存或应用层缓存:
-- MySQL查询缓存(需配置query_cache_type=1)
SELECT SQL_CACHE order_id, total_amount
FROM orders
WHERE create_time BETWEEN '2025-06-10' AND '2025-06-20';-- 应用层缓存示例(PHP代码)
$cacheKey = 'orders_20250610_20250620';
$orders = redis_get($cacheKey);
if (!$orders) {$orders = db_query("SELECT order_id, total_amount FROM orders WHERE create_time BETWEEN '2025-06-10' AND '2025-06-20'");redis_set($cacheKey, $orders, 3600); // 缓存1小时
}
六、实战案例:电商系统复杂查询优化全流程
场景:查询"近30天内购买过TOP10热销商品的用户及其复购率"
原始查询(耗时12秒):
SELECT u.user_id, u.username, COUNT(DISTINCT o.order_id) as order_count,(SELECT COUNT(*) FROM orders o2 WHERE o2.user_id = u.user_id AND o2.create_time > '2025-05-20') as total_orders,(COUNT(DISTINCT o.order_id) / (SELECT COUNT(*) FROM orders o3 WHERE o3.user_id = u.user_id AND o3.create_time > '2025-05-20')) as repurchase_rate
FROM users u
JOIN orders o ON u.user_id = o.user_id
JOIN order_items oi ON o.order_id = oi.order_id
WHERE o.create_time > '2025-05-20'
AND oi.product_id IN (-- TOP10热销商品SELECT product_id FROM order_itemsWHERE create_time > '2025-05-20'GROUP BY product_id ORDER BY SUM(quantity) DESC LIMIT 10
)
GROUP BY u.user_id, u.username;
优化步骤:
- 子查询转JOIN:将TOP10商品查询转为CTE
WITH top_products AS (SELECT product_id FROM order_itemsWHERE create_time > '2025-05-20'GROUP BY product_id ORDER BY SUM(quantity) DESC LIMIT 10
)
- 预计算复购率数据:避免重复查询订单表
CREATE TEMPORARY TABLE temp_user_orders AS
SELECT user_id, COUNT(*) as total_orders
FROM orders
WHERE create_time > '2025-05-20'
GROUP BY user_id;
- 重构查询结构:
-- 优化后查询(耗时1.4秒)
WITH top_products AS (SELECT product_id FROM order_itemsWHERE create_time > '2025-05-20'GROUP BY product_id ORDER BY SUM(quantity) DESC LIMIT 10
),
user_order_stats AS (SELECT user_id, COUNT(*) as total_ordersFROM ordersWHERE create_time > '2025-05-20'GROUP BY user_id
)
SELECT u.user_id, u.username, COUNT(DISTINCT o.order_id) as order_count,s.total_orders,IF(s.total_orders > 0, COUNT(DISTINCT o.order_id) / s.total_orders, 0) as repurchase_rate
FROM users u
JOIN orders o ON u.user_id = o.user_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN top_products tp ON oi.product_id = tp.product_id
LEFT JOIN user_order_stats s ON u.user_id = s.user_id
WHERE o.create_time > '2025-05-20'
GROUP BY u.user_id, u.username;
优化效果分析:
- 执行计划扫描行数从890万降至78万
- 临时表使用从
Using temporary
变为Using index
- 复购率计算从3次子查询变为1次JOIN
七、总结:复杂查询优化的核心原则
- 减少数据扫描量:通过索引、过滤条件先缩小结果集
- 避免重复计算:利用CTE、临时表缓存中间结果
- 优先JOIN替代子查询:嵌套子查询的嵌套层级应控制在2层以内
- 关注执行计划:重点优化
Using filesort
、Using temporary
、Full table scan
等低效操作
实际优化中需结合业务场景灵活调整策略,必要时可通过STRAIGHT_JOIN
强制指定JOIN顺序,或利用SQL_BIG_RESULT
提示优化分组排序性能。记住:最优的查询方案往往是数据库引擎成本估算与业务逻辑的平衡点。
相关文章:
MySQL复杂查询优化实战:从多表关联到子查询的性能突破
文章目录 一、复杂查询性能瓶颈分析与优化框架二、多表关联查询的优化策略与实战1. JOIN顺序优化:基于成本估算的表关联策略2. 复合索引与JOIN条件优化3. 大表JOIN的分片处理 三、子查询优化:从嵌套到JOIN的转换艺术1. 标量子查询转换为JOIN2. EXISTS子查…...
LeetCode 680.验证回文串 II
目录 题目: 题目描述: 题目链接: 思路: 核心思路: 思路详解: 代码: C代码: Java代码: 题目: 题目描述: 题目链接: 680. 验证…...
window显示驱动开发—输出合并器阶段
逻辑管道中的最后一步是通过模具或深度确定可见性,以及写入或混合输出以呈现目标,这可以是多种资源类型之一。 这些操作以及输出资源 (呈现目标) 绑定在输出合并阶段定义。 1. 核心功能与管线定位 输出合并是渲染管线的最终固定功能阶段,负…...
单片机开发日志cv MDK-ARM工具链迁移到MAKE
核心经验: STM32H7 多 RAM 区域,外设相关数据段必须放在 AXI SRAM(RAM)区,不能放在 DTCMRAM,否则外设无法访问,程序表面正常但外设全失效。迁移工程时,务必检查链接脚本的内存分布&a…...
大模型与搜索引擎的技术博弈及未来智能范式演进
基于认知革命与技术替代的全景综述 一、大模型对搜索引擎的替代性分析:技术范式与市场重构 (1)技术原理的代际分野 传统搜索引擎遵循 "爬虫抓取 - 索引构建 - 关键词排序" 的三段式架构,其核心是基于 PageRank 算法的…...
Ajax-入门
Ajax: 全称Asynchronous JavaScript And XML,异步的JavaScript和XML。其作用有如下2点: 与服务器进行数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下&a…...
FPGA基础 -- Verilog 共享任务(task)和函数(function)
Verilog 中共享任务(task)和函数(function) 的详细专业培训,适合具有一定 RTL 编程经验的工程师深入掌握。 一、任务(task)与函数(function)的基本区别 特性taskfunctio…...
c++set和pair的使用
set是C中的一种关联容器,具有以下特点: 存储唯一元素(不允许重复) 元素自动排序(默认升序) 基于红黑树实现(平衡二叉搜索树) 插入、删除和查找的时间复杂度为O(log n) 前言 在C…...
数据库中间件ShardingSphere5
一、高性能架构模式 数据库集群,第一种方式“读写分离”,第二种方式“数据库分片”。 1.1 读写分离架构 读写分离原理:将数据库读写操作分散到不同的节点上。 读写分离的基本实现: 主库负责处理事务性的增删改操作,…...
window显示驱动开发—使用状态刷新回调函数
用户模式显示驱动程序可以使用 Direct3D 运行时版本 10 State-Refresh回调函数 来实现无状态驱动程序或构建命令缓冲区前导数据。 Direct3D 运行时在调用 CreateDevice (D3D10 ) 函数时,向D3D10DDIARG_CREATEDEVICE结构的 pUMCallbacks 成员指向的D3D10DDI_CORELAY…...
windows11右击恢复为windows10
文章目录 前言一、问题描述二、解决方案 前言 为了解决win11的右击更多选项的问题 一、问题描述 win11的右键更多选项过于繁琐 二、解决方案 在windows11的终端管理员中输入如下代码: reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c…...
基于物联网的智能衣柜系统设计
标题:基于物联网的智能衣柜系统设计 内容:1.摘要 随着物联网技术的飞速发展,智能家居领域迎来了新的变革机遇。本研究的目的在于设计一种基于物联网的智能衣柜系统,以提升用户的衣物管理和使用体验。方法上,通过搭建物联网硬件平台ÿ…...
GM DC Monitor v2.0 卸载教程
以下俩种方法任选一种均可 第一种方法:一键自动卸载 进入到软件安装目录 卸载app 进入到app目录,运行一键卸载脚本:sh uninstall.sh 卸载es 进入到es目录,运行一键卸载脚本:sh uninstall.sh 卸载db 进入到db目录&a…...
C#上位机实现报警语音播报
我们在开发C#上位机时,有时候会需要将报警信息通过语音进行播报,今天跟大家分享一下具体的实现过程。 一、组件安装 首先我们创建好一个Windows窗体项目,然后添加System.Speech库引用。 点击引用,右击添加引用,在程…...
python自助棋牌室管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
榕壹云婚恋相亲系统:ThinkPHP+UniApp打造高效婚配平台
引言 在数字化浪潮下,婚恋相亲行业正加速向线上迁移。榕壹云公司基于市场需求与技术积累,开发一款功能完备、技术开源的婚恋相亲小程序系统,为单身人士提供高效、安全的婚恋平台。本文将围绕系统背景、客户定位、核心技术、功能模块及优势场景展开详细解析,助力开发者与技…...
每日leetcode
2890. 重塑数据:融合 - 力扣(LeetCode) 题目 DataFrame report --------------------- | Column Name | Type | --------------------- | product | object | | quarter_1 | int | | quarter_2 | int | | quarter_3 | i…...
深入理解XGBoost(何龙 著)学习笔记(五)
深入理解XGBoost(何龙 著)学习笔记(五) 本文接上一篇,内容为线性回归,介绍三部分,首先介绍了"模型评估”,然后分别提供了线性回归的模型代码:scikit-learn的Linear…...
SelectDB 在 AWS Graviton ARM 架构下相比 x86 实现 36% 性价比提升
在海量数据分析中,追求高性价比已成为各大企业的主流趋势。ARM 架构凭借其高能效和低成本的特点,逐渐在数据中心崛起,成为理想的高性价比选择。基于 ARM 架构的 AWS Graviton 系列处理器,正是这一趋势的典型代表。Graviton 处理器…...
机器学习流量识别(pytorch+NSL-KDD+多分类建模)
本文主要实现以下功能,会提供完整的可运行的代码以及解释为什么这么设计。文章不会收费,若被限制查看,请私信我。 使用 NSL-KDD 数据集的CSV文件进行流量攻击检测,使用机器学习算法实现流量攻击检测,使用pytorch框架…...
三种经典算法无人机三维路径规划对比(SMA、HHO、GWO三种算法),Matlab代码实现
代码功能 该MATLAB代码用于对比三种元启发式优化算法(SMA、HHO、GWO三种算法, SMA黏菌算法、HHO哈里斯鹰优化算法、GWO灰狼优化算法) 在特定优化问题上的性能,运行环境MATLABR2020b或更高 : 初始化问题模型ÿ…...
FTTR+软路由网络拓扑方案
文章目录 网络拓扑软路由配置FTTR光猫路由器TPLink路由器配置WAN设置LAN设置 参考 网络拓扑 软路由配置 配置静态IP地址:192.168.1.100设置网关指向主路由的IP 设置自定义DNS服务器 开启DHCP 这一步很关键,可以让连上wifi的所有设备自动趴强。 FTTR光猫…...
服务器获取外网IP,并发送到钉钉
服务器获取外网IP,并发送到钉钉 import time import hmac import hashlib import base64 import urllib.parse import requests# 请填入你的钉钉机器人配置 access_token XXXX secret XXXX# 获取公网 IP def get_public_ip():try:response requests.get("…...
解决uni-app发布微信小程序主包大小限制为<2M的问题
一 问题说明 我想用uniapp开发多端应用,引入了uview组件库来美化样式,可发布为微信小程序却提示我代码质量不过关,主包代码量太大了: 二 问题分析 2.1 原生微信小程序开发代码质量限制: 1.主包代码大小不得大于2M&…...
魅族“换血”出牌:手机基本盘站不稳,想靠AI和汽车“改命”
撰稿|何威 来源|贝多财经 被吉利收购后,魅族逐渐转向在AI领域躬身耕作。 自2024年2月以“All in AI”正式宣告转型、喊出不再推出传统智能手机的豪言开始,这家曾以设计见长的手机厂商,将下半场押注在AI终端、AR眼镜与智能座舱系统上&#…...
原点安全入选 Gartner®“数据安全平台”中国市场指南代表厂商
2025年1月7日,全球权威咨询与分析机构 Gartner 发布《中国数据安全平台市场指南》(China Context: ‘Market Guide for Data Security Platforms’),北京原点数安科技有限公司(简称“原点安全”,英文名称&q…...
uni-app-配合iOS App项目开发apple watch app
假设你已经用uni-app开发好了一个iOS端的app,现在想要开发一个配套的apple watch app。改怎么去开发呢?是不是一头雾水,这篇文章就会介绍一些apple watch app开发的知识以及如何在uni-app开发的iOS app基础上去开发配套的watch app。 一、ap…...
如何理解Java反射机制
反射机制原理 反射是Java在运行时动态获取类信息、操作类属性和方法的能力。核心原理是JVM在类加载时创建Class对象,该对象包含类的完整结构信息。 关键类: Class:类的元数据入口 Field:类的成员变量 Method:类的方…...
SM3算法C语言实现(无第三方库,带测试)
一、SM3算法介绍 SM3算法是中国国家密码管理局(OSCCA)于2010年发布的商用密码散列函数标准,属于我国自主设计的密码算法体系之一 ,标准文档下载地址为:SM3密码杂凑算法 。SM3算法输出长度为256位(32字节&a…...
King’s LIMS 系统引领汽车检测实验室数字化转型
随着汽车保有量的持续攀升和车龄的增长,消费者对汽车的需求已悄然转变,从最初对外观和性能的追求,逐渐深化为对安全性、可靠性、耐久性、性能与舒适性以及智能化功能的全方位关注。这无疑让汽车检测行业在保障车辆质量、满足市场需求方面肩负…...
CppCon 2017 学习:Mocking Frameworks Considered
当然可以,下面是对 Fowler 的 Whiskey-Store 示例。 Fowler 的 Whiskey-Store 示例(坏设计) 贴出的类图是 Martin Fowler 在《重构》书中使用的一个教学用反面案例(故意设计得不合理),用来说明如何通过重…...
通过事件过滤器拦截QRadioButton点击事件
通过事件过滤器拦截QRadioButton点击事件 一、事件过滤器完整实现 1. 核心代码扩展(含注释) bool MainWindow::eventFilter(QObject* obj, QEvent* ev) {// 拦截所有QRadioButton的鼠标事件(包括点击、释放、双击)if (ev->ty…...
领码 SPARK 融合平台赋能工程建设行业物资管理革新——数智赋能,重塑中国模式新范式
摘要 工程建设行业正加速迈向数字化与精益化转型,物资管理成为项目成败的关键瓶颈。本文深入解析中国工程企业“项目部-物资部-企业项目管理部”三级协同的独特物资管理体系,聚焦集中采购与零星采购的统筹难题。基于领码 SPARK 融合平台,提出…...
“地标界爱马仕”再启:世酒中菜联袂陈汇堂共筑新会陈皮顶奢产业
“地标界爱马仕”再启战略新篇:世酒中菜联袂陈汇堂,共筑新会陈皮顶奢产业生态 ——中世国际与陈汇堂股权合作签约仪式在国际地理标志服务基地举行 江门市新会区,2025年6月20日——被誉为“地标界爱马仕”的全球顶奢品牌运营商世酒中菜 &…...
.Net Framework 4/C# 数据访问技术(ADO.NET)
一、数据库基础 (一) 数据库简介 数据库是按照数据结构来组织、存储和管理数据的仓库,是存储在一起的相关数据的集合。 (二) SQL 语言简介 SQL 是一种数据库查询和程序设计语言,用于存取数据以及查询,更新和管理关系型数据库系统。在编写 SQL 语句时,SQL 语句各关键字要以…...
北京京东,看看难度
最近由于三大外卖平台“打仗”,优惠券多到数不过来,一日三餐每个平台各点一单哈哈哈,正好最近组织内部还有朋友在北京的京东面试过,分享一下她的面经(Java岗): 1. Kafka消息不丢失问题…...
RPGMZ游戏引擎 如何手动控制文字显示速度
直接上代码 const _Window_Base_prototype_initialize Window_Base.prototype.initialize;Window_Base.prototype.initialize function(rect) {_Window_Base_prototype_initialize.call(this, rect);this.文字速度缓冲 0;}; this.文字速度缓冲 0; 进行缓冲 Window_Base…...
linux线程同步
互斥锁 同步与互斥概述** 现代操作系统基本都是多任务操作系统,即同时有大量可调度实体在运行。在多任务操作系统中,同时运行的多个任务可能: 都需要访问/使用同一种资源 多个任务之间有依赖关系,某个任务的运行依赖于另一个任…...
大内存对电脑性能有哪些提升
在科技飞速发展的今天,电脑已经成为我们生活和工作中不可或缺的伙伴。无论是日常办公、追剧娱乐,还是进行复杂的游戏和专业设计,电脑的性能都至关重要。而在影响电脑性能的众多因素中,内存大小常常被人们忽视。 多任务处理更流畅…...
什么是“微博养铁粉”以及如何增加微博铁粉
发了个发微博养铁工具_微博养铁粉的定义 微博养铁粉是指粉丝通过与博主的互动,成为博主的铁粉。铁粉是微博推出的一种反映粉丝与博主之间亲密度的互动产品。成为铁粉后,粉丝的评论权重增加,更容易上前排,点赞和评论的效果也会更好…...
华为和H3C服务器配置远控管理地址
1、华为RH2288_V3服务器 1.1、启动服务器按DEL按键进入服务器bios 1.2、选择Advanced菜单中的 IPMI iBMC Configuration配置项回车进入。 1.3、IPMI iBMC Configuration配置界面中选择IBMC Configuration配置项回车进入。 1.4、IBMC Configuration 配置项中配置IPV4 Configura…...
Git 查询与切换分支的完整指南
Git 查询与切换分支的完整指南 1. 查询分支列表 查看本地分支 git branch当前分支会以绿色显示并带有 * 标记添加 -v 或 -vv 查看更详细的信息(最后一次提交和跟踪关系) git branch -v # 或者 git branch -vv查看所有分支(包括远程分支&a…...
Spring 中的依赖注入(DI)详解
📌 摘要 在现代 Java 开发中,依赖注入(Dependency Injection, DI) 是 Spring 框架最核心的功能之一。它通过解耦对象之间的依赖关系,提高了代码的可维护性、可测试性和可扩展性。 本文将全面讲解 Spring 中依赖注入的…...
Bytebase 3.7.1 - 数据库变更功能全免费!
🔔 重大变更 所有数据库变更相关功能现已在社区版中完全免费开放!详情请查看我们的最新定价。 🎄 改进 文档网站全面升级,改进导航、搜索功能,以及与 AI 集成自助回答问题。SQL 编辑器现在会高亮光标所在的语句。SQ…...
深度学习笔记27-LSTM实现糖尿病探索与预测(Pytorch)
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 一、前期准备 1.数据导入 import torch.nn as nn import torch.nn.functional as F import torchvision,torch import numpy as np import pandas as pd impo…...
3DS中文游戏全集下载 任天堂3DS简介3DS第一方独占游戏推荐
任天堂3DS 的详细介绍,涵盖其硬件特性、核心功能、游戏阵容及历史地位: 3DS游戏全集下载 https://pan.quark.cn/s/dd40e47387e7 https://sink-698.pages.dev/3ds CIA CCA 等格式可用于3DS模拟器和3DS实体机 3DS 是什么? 全称:Nin…...
vue3 reactive重新赋值
在 Vue 3 中,如果你想使用 reactive API 来创建一个响应式对象,并且之后需要更新这个对象中的属性,你可以按照以下步骤进行: 1. 使用 reactive 创建响应式对象 首先,你需要从 Vue 的 reactive API 中创建一个响应式对…...
全面掌握 C++ 基础:关键特性与进化
文章目录 全面掌握 C 基础:关键特性与进化1. C 关键字2. 命名空间(namespace)⚠️ 示例 2.1 定义命名空间2.2 使用成员的方法 3. C 输入/输出(iostream)4. 缺省参数(Default Parameter)4.1 定义…...
HTML一键打包EXE串口API介绍
HTML一键打包EXE软件(HTML转EXE) 支持将Web前端项目转换为Windows平台下的独立可执行程序(EXE),适用于Windows 7及以上系统,无需额外配置系统环境, 软件包含多种内核, 包括IE内核, Chrome内核, 以及WebView2(永久免费), 适用于不同…...
.docx 和 .doc 都是 Word 文档格式的区别
.docx 和 .doc 都是 Word 文档格式,但有区别: .docx 是新版 Word 格式(推荐使用) 从 Microsoft Word 2007 起引入的格式全名是:Office Open XML Document实际是一个 压缩包(ZIP)结构࿰…...