提升性能300ms:深入解析Spring多表联接查询优化与SQL调优实战
优化所需知识点(必须掌握)
索引篇
explain命令
重点:这是后续分析是否使用索引以及使用是否恰当的工具
作用:查看sql的执行计划,可以看sql语句是否使用了索引,索引的使用情况,以及sql的性能。
使用方法:explain+查询语句,例如:explain select * from test
字段解释(只讲需要用到的)
字段 | 含义 | |
id | 一条sql语句表的执行顺序(id相同从上到下顺序执行。id不同,值越大越先执行) | |
type | 表示连接类型,性能有好到差连接类型为 null,system,const,eq_ref,ref,range,index,all | |
possible_key | 可能应用在这张表上的索引(一个或多个) | |
key | 实际使用的索引,如果为null,则没有使用索引 | |
Extra | 字段 | 含义 |
Using index | 性能好,不需要回表查询 | |
Using where | 性能好,不需要回表查询 | |
Using index condition | 需要回表查询 | |
Using temporary | 在查询过程中使用了临时表 | |
Using filesort | 使用了额外的排序操作来满足 ORDER BY 子句 |
索引使用原则
重点:这决定了你创建哪些索引可以提升性能
- 针对数据量大并且查询比较频繁的表建立索引
- 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
- 尽量选择区分度高的列(例如身份证)作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
- 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
- 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间, 避免回表,提高查询效率
- 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
- 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。
索引失效场景
重点:创建了索引但是失效了得不偿失
- 联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效(解决方案:使用>=、<=)
- 不要在索引列上进行运算操作, 索引将失效
- 字符串类型字段使用时,不加引号,索引将失效
- 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
- 用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会 被用到。
优化实战
代码展示
SELECTDISTINCTu.id AS id,uicm.code,mbi.trueName AS name,FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) AS age,mbi.education,mbi.height,CASEWHEN mbi.marriage IN (2, 11, 12, 13) THEN '离异'WHEN mbi.marriage = 3 THEN '丧偶'ELSE ''END AS marriage,mbi.hometownCode,mbi.workCity,mbi.occupation,u.sex,u.gmt_create AS time,CASE WHEN uicm.status = 0 THEN 0 ELSE 1 END AS is_off,u.phone,sc.worker_id AS workerId,-- mbi.car,-- mbi.house,-- CASE-- WHEN mbi.income = 3 THEN '3K以上'-- WHEN mbi.income = 4 THEN '3K-5K'-- WHEN mbi.income = 5 THEN '5K-8K'-- WHEN mbi.income = 6 THEN '8K-12K'-- WHEN mbi.income = 7 THEN '12K-20K元'-- WHEN mbi.income = 8 THEN '20K-50K元'-- WHEN mbi.income = 9 THEN '50K以上'-- ELSE NULL-- END AS income,CASEWHEN EXISTS (SELECT 1 FROM lspace_member.sea_customer_listWHERE member_id = u.idAND tenant_id = u.tenant_idAND shop_id = u.shop_id) THEN 1ELSE 0 END as isSea,CASEWHEN EXISTS (select 1 from lspace_member.blank_member where member_id = u.id) THEN 1ELSE 0 END as isBlank,CASEWHEN (SELECT urlFROM lspace_member.member_photoWHERE member_id = u.idAND type = 16AND STATUS = 1ORDER BY id DESC LIMIT 1) IN (NULL, 'https://static.lspace.vip/images/my/boy.jpg', 'https://static.lspace.vip/images/my/girl.jpg')THEN NULLELSE (SELECT urlFROM lspace_member.member_photoWHERE member_id = u.idAND type = 16AND STATUS = 1ORDER BY id DESC LIMIT 1)END AS urlsFROMlspace_usercenter.`user` uinner join lspace_diga.user_id_code_mapping uicm on uicm.user_id=u.idINNER JOINlspace_member.memberbaseinfo mbi ON mbi.memberId = u.id<if test="memberListReq.isMyCustomer == 1">inner join lspace_member.service_case sc on sc.worker_id=#{memberListReq.workerId} and sc.member_id = u.id and sc.case_type=1</if><if test="memberListReq.isMyCustomer == 0">left join lspace_member.service_case sc on sc.member_id = u.id and sc.case_type=1</if>left JOIN lspace_member.upgrade_vip_queue uvq on uvq.member_id=u.id and uvq.status=2left JOIN lspace_member.service_period sp on sp.member_id=u.id and uvq.order_id=sp.order_idWHEREu.sex = #{memberListReq.sex}AND u.sex IS NOT NULL<if test="memberListReq.homeTowns != null and !memberListReq.homeTowns.isEmpty()">and mbi.hometownCode in<foreach item="item" index="index" collection="memberListReq.homeTowns" open="(" separator=","close=")">#{item,jdbcType=INTEGER}</foreach></if><if test="memberListReq.workCitys != null and !memberListReq.workCitys.isEmpty()">and mbi.workCity in<foreach item="item" index="index" collection="memberListReq.workCitys" open="(" separator=","close=")">#{item,jdbcType=INTEGER}</foreach></if><if test="memberListReq.minAge != null">AND FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) >= #{memberListReq.minAge}</if><if test="memberListReq.maxAge != null">AND FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) <= #{memberListReq.maxAge}</if><if test="memberListReq.text != null and memberListReq.text != ''">AND(uicm.code LIKE CONCAT('%',#{memberListReq.text}, '%')oru.phone=#{memberListReq.text})</if>group byu.idORDER BYuicm.score DESC,CASEWHEN MIN(sp.start_time) IS NOT NULL THEN MIN(sp.start_time)ELSE u.gmt_createEND DESC,u.id ASClimit #{offest},#{size}
第一步:连表优化
根据阿里巴巴的《Java 开发手册》中的 SQL 设计规范,关于 SQL 查询中涉及的表的数量并没有具体的硬性限制,但是在实践中,阿里规范建议尽量避免过多的表连接,建议连表数量小于3张。
上面这段sql主要是为了查询出符合条条件的用户。这是优化前代码,链表7张,非必要链表2张。根据业务需求,可以看看你业务需求中是不是连的表都必须连,很影响性能,能拆则拆。我根据业务分析后我发现有两张表可以拆出来,拆!
拆后代码:
SELECTDISTINCTu.id AS id,uicm.code,mbi.trueName AS name,FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) AS age,mbi.education,mbi.height,CASEWHEN mbi.marriage IN (2, 11, 12, 13) THEN '离异'WHEN mbi.marriage = 3 THEN '丧偶'ELSE ''END AS marriage,mbi.hometownCode,mbi.workCity,mbi.occupation,u.sex,u.gmt_create AS time,CASE WHEN uicm.status = 0 THEN 0 ELSE 1 END AS is_off,u.phone,sc.worker_id AS workerId,CASEWHEN (SELECT urlFROM lspace_member.member_photoWHERE member_id = u.idAND type = 16AND STATUS = 1ORDER BY id DESC LIMIT 1) IN (NULL, 'https://static.lspace.vip/images/my/boy.jpg', 'https://static.lspace.vip/images/my/girl.jpg')THEN NULLELSE (SELECT urlFROM lspace_member.member_photoWHERE member_id = u.idAND type = 16AND STATUS = 1ORDER BY id DESC LIMIT 1)END AS urlsFROMlspace_usercenter.`user` uinner join lspace_diga.user_id_code_mapping uicm on uicm.user_id=u.idINNER JOINlspace_member.memberbaseinfo mbi ON mbi.memberId = u.id<if test="memberListReq.isMyCustomer == 1">inner join lspace_member.service_case sc on sc.worker_id=#{memberListReq.workerId} and sc.member_id = u.id and sc.case_type=1</if><if test="memberListReq.isMyCustomer == 0">left join lspace_member.service_case sc on sc.member_id = u.id and sc.case_type=1</if>left JOIN lspace_member.upgrade_vip_queue uvq on uvq.member_id=u.id and uvq.status=2left JOIN lspace_member.service_period sp on sp.member_id=u.id and uvq.order_id=sp.order_idWHEREu.sex = #{memberListReq.sex}AND u.sex IS NOT NULL<if test="memberListReq.homeTowns != null and !memberListReq.homeTowns.isEmpty()">and mbi.hometownCode in<foreach item="item" index="index" collection="memberListReq.homeTowns" open="(" separator=","close=")">#{item,jdbcType=INTEGER}</foreach></if><if test="memberListReq.workCitys != null and !memberListReq.workCitys.isEmpty()">and mbi.workCity in<foreach item="item" index="index" collection="memberListReq.workCitys" open="(" separator=","close=")">#{item,jdbcType=INTEGER}</foreach></if><if test="memberListReq.minAge != null">AND FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) >= #{memberListReq.minAge}</if><if test="memberListReq.maxAge != null">AND FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) <= #{memberListReq.maxAge}</if><if test="memberListReq.text != null and memberListReq.text != ''">AND(uicm.code LIKE CONCAT('%',#{memberListReq.text}, '%')oru.phone=#{memberListReq.text})</if>group byu.idORDER BYuicm.score DESC,CASEWHEN MIN(sp.start_time) IS NOT NULL THEN MIN(sp.start_time)ELSE u.gmt_createEND DESC,u.id ASClimit #{offest},#{size}
第二步:SQL优化
在SQL语句中少做运算可提高新增,而且可以有效避免索引失效,所以尽量不要在SQL做运算。
这三种,第一种在java代码中预先计算生日后作为条件搜索,避免了函数运算和索引失效,所以做了第二步优化
1. mbi.birthday <= '2000-01-08'
2. FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) >= 25
3.mbi.birthday <= DATE_SUB(CURDATE(), INTERVAL 25 YEAR)
优化后代码:
SELECTu.id AS id,uicm.code,mbi.trueName AS name,FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) AS age,mbi.education,mbi.height,CASEWHEN mbi.marriage IN (2, 11, 12, 13) THEN '离异'WHEN mbi.marriage = 3 THEN '丧偶'ELSE ''END AS marriage,mbi.hometownCode,mbi.workCity,mbi.occupation,u.sex,u.gmt_create AS time,CASE WHEN uicm.status = 0 THEN 0 ELSE 1 END AS is_off,u.phone,sc.worker_id AS workerId,CASEWHEN (SELECT urlFROM lspace_member.member_photoWHERE member_id = u.idAND type = 16AND STATUS = 1ORDER BY id DESC LIMIT 1) IN (NULL, 'https://static.lspace.vip/images/my/boy.jpg', 'https://static.lspace.vip/images/my/girl.jpg')THEN NULLELSE (SELECT urlFROM lspace_member.member_photoWHERE member_id = u.idAND type = 16AND STATUS = 1ORDER BY id DESC LIMIT 1)END AS urlsFROMlspace_usercenter.`user` uinner join lspace_diga.user_id_code_mapping uicm on uicm.user_id=u.idINNER JOINlspace_member.memberbaseinfo mbi ON mbi.memberId = u.id<if test="memberListReq.isMyCustomer == 1">inner join lspace_member.service_case sc on sc.worker_id=#{memberListReq.workerId} and sc.member_id = u.id and sc.case_type=1</if><if test="memberListReq.isMyCustomer == 0">left join lspace_member.service_case sc on sc.member_id = u.id and sc.case_type=1</if>left JOIN lspace_member.upgrade_vip_queue uvq on uvq.member_id=u.id and uvq.status=2left JOIN lspace_member.service_period sp on sp.member_id=u.id and uvq.order_id=sp.order_idWHEREu.sex = #{memberListReq.sex}AND u.sex IS NOT NULL<if test="memberListReq.homeTowns != null and !memberListReq.homeTowns.isEmpty()">and mbi.hometownCode in<foreach item="item" index="index" collection="memberListReq.homeTowns" open="(" separator=","close=")">#{item,jdbcType=INTEGER}</foreach></if><if test="memberListReq.workCitys != null and !memberListReq.workCitys.isEmpty()">and mbi.workCity in<foreach item="item" index="index" collection="memberListReq.workCitys" open="(" separator=","close=")">#{item,jdbcType=INTEGER}</foreach></if><if test="memberListReq.minBirthday != null and memberListReq.minAge!=0">AND mbi.birthday <= #{memberListReq.minBirthday}</if><if test="memberListReq.maxBirthday != null">AND mbi.birthday >= #{memberListReq.maxBirthday}</if>
<!-- <if test="memberListReq.minAge != null">-->
<!-- AND FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) >= #{memberListReq.minAge}-->
<!-- </if>-->
<!-- <if test="memberListReq.maxAge != null">-->
<!-- AND FLOOR(DATEDIFF(CURDATE(), mbi.birthday) / 365.25) <= #{memberListReq.maxAge}-->
<!-- </if>--><if test="memberListReq.text != null and memberListReq.text != ''">AND(uicm.code LIKE CONCAT('%',#{memberListReq.text}, '%')oru.phone=#{memberListReq.text})</if>group byu.idORDER BYuicm.score DESC,MIN(sp.start_time) DESC,u.gmt_create desc,u.id ASClimit #{offest},#{size}
第三步:加索引
根据索引篇的知识点,在区分度高,数据列多,条件搜索,排序这个上面创建索引。创建后使用explain命令逐一分析,创建的索引是否有效,是否被使用。在进行调整
根据我的业务需求我添加了3个索引来满足我的业务需求
CREATE INDEX idx_workCity ON lspace_member.memberbaseinfo (workCity);
CREATE INDEX idx_hometown ON lspace_member.memberbaseinfo (hometownCode);CREATE INDEX idx_code ON lspace_diga.user_id_code_mapping (code);
第四步:java代码优化
根据感觉简单优化了一下代码,对效率其实影响不太大。大家也自我感觉优化一下吧,特别涉及是for循环,for循环中有查询的重点关注一下!!!
总结
根据以上方式速度快了将近一半,300ms左右。主要也是对SQL的优化,合理的使用索引,恰当的链表方式可以大大提高性能。
相关文章:
提升性能300ms:深入解析Spring多表联接查询优化与SQL调优实战
优化所需知识点(必须掌握) 索引篇 explain命令 重点:这是后续分析是否使用索引以及使用是否恰当的工具 作用:查看sql的执行计划,可以看sql语句是否使用了索引,索引的使用情况,以及sql的性能。 …...
增量导入和全量导入的区别是什么?
定义 全量导入:是指将数据源中的所有数据一次性全部导入到目标系统中。例如,一个电商公司要将其旧数据库中的所有商品信息(包括商品名称、价格、库存等)全部迁移到新的数据库系统中,这个过程就是全量导入。这种方式会覆…...
【百度智能云客悦智能客服】搭建AI agent智能对话 - 购车推荐
前期准备 平台链接:https://keyue.cloud.baidu.com/ 一、开始创建 二、会话流程配置 我们以购车推荐的案例,来进行 AI agent 配置演示 1.添加开场白 在 起始主题 画布中,我们可以配置 AI agent 的开场白,画布左侧默认有 开始 …...
【HTML+CSS+JS+VUE】web前端教程-3-标题标签
标题介绍与应用 标题是通过<h1>-<h6>标签进行定义的 <h1>定义最大的标题 <h6>定义最小的标题<h1...
逐笔成交逐笔委托Level2高频数据下载和分析:20250102
level2逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/1p7OOj5p-QGFrWkt6KKoYng?pwd7f4g 提取码: 7f4g Level2逐笔成交逐笔委托数据分享下载 通过Level2逐笔成交和逐笔委托这种每一笔的毫秒级别的数据可以分析出很多有用的点,包括主力意图,虚假动…...
JavaEE之线程池
前面我们了解了多个任务可以通过创建多个线程去处理,达到节约时间的效果,但是每一次的线程创建和销毁也是会消耗计算机资源的,那么我们是否可以将线程进阶一下,让消耗计算机的资源尽可能缩小呢?线程池可以达到此效果&a…...
java 中 main 方法使用 KafkaConsumer 拉取 kafka 消息如何禁止输出 debug 日志
pom 依赖: <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.14.RELEASE</version> </dependency> 或者 <dependency><groupId>org.ap…...
【后端面试总结】Golang可能的内存泄漏场景及应对策略
Golang可能的内存泄漏场景及应对策略 一、引言 Golang作为一种高性能、并发友好的编程语言,其内置的垃圾回收机制极大地简化了内存管理。然而,这并不意味着开发者可以完全忽视内存泄漏问题。在实际开发中,由于不当的资源管理、循环引用、以…...
Java 反射机制详解
在 Java 编程世界中,反射机制犹如一把神奇的钥匙,它能够打开许多隐藏在代码深处的 “大门”,让开发者突破常规的限制,实现一些极具灵活性的功能。今天,就跟随我一同深入探究 Java 反射机制的奥秘。 一、什么是反射 反…...
【k8s】scc权限 restricted、anyuid、privileged
文章目录 概述1. 内置的scc2. OpenShift如何确定pod的scc2.1 Pod未带SCC标签的情况2.2. Pod带有SCC标签的情况 参考 概述 在OpenShift(后文简称OCP)中,很早就一个概念:Security Context Constraints ,简称SCC…...
2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)
大家好呀,从发布赛题一直到现在,总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…...
ThreadLocal 的使用场景
在现代电商平台中,ThreadLocal 常用于以下场景,特别是与线程隔离相关的业务中,以提高性能和简化上下文传递。 1. 用户上下文信息管理 场景:在用户发起的每次请求中,需要携带用户 ID、角色、权限等信息,而这…...
后端开发 Springboot整合Redis Spring Data Redis 模板
目录 redis 配置 RedisConfig 类 完整代码 代码讲解 1. 类定义和注解 2. 定义 RedisTemplate Bean 3. 配置 JSON 序列化 4. 配置 Redis 的 key 和 value 序列化方式 5. 完成配置并返回 RedisTemplate 总结 redis 服务接口实现类 类级别 注入 RedisTemplate 常用 Re…...
代码随想录算法训练营第 4 天(链表 2)| 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 -
一、24. 两两交换链表中的节点 题目:24. 两两交换链表中的节点 - 力扣(LeetCode) 视频:帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点_哔哩哔哩_bilibili 讲解:代码随想录 dummy-…...
【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍
从帝国理工的PPT学习。 什么是RDMA Remote Direct Memory Access,也就是Remote的DMA,是一种硬件机制,能直接访问远端结点的内存,而不需要处理器介入。 其中: Remote:跨node进行数据传输Directÿ…...
网络安全常见的35个安全框架及模型
大家读完觉得有帮助记得关注和点赞!!! 01、概述 网络安全专业机构制定的一套标准、准则和程序,旨在帮助组织了解和管理面临的网络安全风险。优秀的安全框架及模型应该为用户提供一种可靠方法,帮助其实现网络安全建设…...
Elasticsearch介绍及使用
Elasticsearch 是一款基于 Lucene 库构建的开源、分布式、RESTful 风格的搜索引擎和分析引擎,具有强大的全文搜索、数据分析、机器学习等功能,广泛应用于日志分析、实时数据分析、全文检索等场景。 核心概念 索引(Index)…...
Leetocde516. 最长回文子序列 动态规划
原题链接:Leetocde516. 最长回文子序列 class Solution { public:int longestPalindromeSubseq(string s) {int n s.size();vector<vector<int>> dp(n, vector<int>(n, 1));for (int i 0; i < n; i) {dp[i][i] 1;if (i 1 < n &&…...
iOS 逆向学习 - Inter-Process Communication:进程间通信
iOS 逆向学习 - Inter-Process Communication:进程间通信 一、进程间通信概要二、iOS 进程间通信机制详解1. URL Schemes2. Pasteboard3. App Groups 和 Shared Containers4. XPC Services 三、不同进程间通信机制的差异四、总结 一、进程间通信概要 进程间通信&am…...
高级生化大纲
一,蛋白质化学: 蛋白质分离是生物化学和分子生物学研究中的一项基本技术,用于根据蛋白质的物理和化学特性将其从混合物中分离出来。 1. 离心分离法 离心分离法利用离心力来分离不同质量或密度的颗粒和分子。 差速离心:通过逐…...
YARN WebUI 服务
一、WebUI 使用 与HDFS一样,YARN也提供了一个WebUI服务,可以使用YARN Web用户界面监视群集、队列、应用程序、服务、流活动和节点信息。还可以查看集群详细配置的信息,检查各种应用程序和服务的日志。 1.1 首页 浏览器输入http://node2.itc…...
【Unity3D】利用IJob、Burst优化处理切割物体
参考文章: 【Unity】切割网格 【Unity3D】ECS入门学习(一)导入及基础学习_unity ecs教程-CSDN博客 【Unity3D】ECS入门学习(十二)IJob、IJobFor、IJobParallelFor_unity ijobparallelfor-CSDN博客 工程资源地址&…...
【大前端】Vue3 工程化项目使用详解
目录 一、前言 二、前置准备 2.1 环境准备 2.1.1 create-vue功能 2.1.2 nodejs环境 2.1.3 配置nodejs的环境变量 2.1.4 更换安装包的源 三、工程化项目创建与启动过程 3.1 创建工程化项目 3.2 项目初始化 3.3 项目启动 3.4 核心文件说明 四、VUE两种不同的API风格 …...
基于文件系统分布式锁原理
分布式锁:在一个公共的存储服务上打上一个标记,如Redis的setnx命令,是先到先得方式获得锁,ZooKeeper有点像下面的demo,比较大小的方式判决谁获得锁。 package com.ldj.mybatisflex.demo;import java.util.*; import java.util.co…...
简历整理YH
一,订单中心 1,调拨单 融通(Rocketmq)-订单中心:ECC_BMS123(已出单),125(分配),127(发货),129(收货) 通过RocketMq接入多场景订单数据 2,销售单 sap(FTP)-订单中心,下发1002,1003,…...
Kotlin 协程基础三 —— 结构化并发(二)
Kotlin 协程基础系列: Kotlin 协程基础一 —— 总体知识概述 Kotlin 协程基础二 —— 结构化并发(一) Kotlin 协程基础三 —— 结构化并发(二) Kotlin 协程基础四 —— CoroutineScope 与 CoroutineContext Kotlin 协程…...
微信小程序实现长按录音,点击播放等功能,CSS实现语音录制动画效果
有一个需求需要在微信小程序上实现一个长按时进行语音录制,录制时间最大为60秒,录制完成后,可点击播放,播放时再次点击停止播放,可以反复录制,新录制的语音把之前的语音覆盖掉,也可以主动长按删…...
校园跑腿小程序---轮播图,导航栏开发
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...
详细全面讲解C++中重载、隐藏、覆盖的区别
文章目录 总结1、重载示例代码特点1. 模板函数和非模板函数重载2. 重载示例与调用规则示例代码调用规则解释3. 特殊情况与注意事项二义性问题 函数特化与重载的交互 2. 函数隐藏(Function Hiding)概念示例代码特点 3. 函数覆盖(重写ÿ…...
一文读懂单片机的串口
目录 串口通信的基本概念 串口通信的关键参数 单片机串口的硬件连接 单片机串口的工作原理 数据发送过程 数据接收过程 单片机串口的编程实现 以51单片机为例 硬件连接 初始化串口 发送数据 接收数据 串口中断服务函数 代码示例 单片机串口的应用实例 单片机与…...
济南企业网站建设公司/百度登录个人中心
平时对于线上的服务器算是十分重视,即使上面有硬件防火墙,然后系统也做了进一步优化,而且还安装了基本防护软件,服务器半年了也没有出现过什么问题。可是我对其他一些不是很重要的服务器却是平时只是简单的维护。因为平时也没有发…...
wordpress调用文章内容标签/百度sem是什么
本文将分以下几个小节来学习: Java的JavaScript脚本引擎脚本开发中涉及到的类和接口简介开发步骤脚本与java数据传递脚本执行上下文作用域方法的调用编译脚本作用域 上例中"ScriptContext.GLOBAL_SCOPE"就是作用域。 ScriptContext的属性以及Bindings接口…...
奉贤网站建设上海站霸/友情链接平台站长资源
我们在使用 windowform 编程的时候,我们或许可能会越到,各种在窗体加载的时候,会进行其他的操作: 1.如果是在加载之前进行其它操作,则整个界面出来的很慢,而且若是时间长的话,页面很久才能出来&…...
软件网站怎么做的/小程序开发公司哪里强
谨献给为了知识执着的嵌入式初学者(转贴)谨献给为了知识执着的嵌入式初学者,欢迎高手补充讨论 实践当然是最锻炼人的方式,但是我想在校生很少有这样的机会,别说本科生,硕士生也未必有条件。所以我想学习嵌入式要从个人的知识背景和…...
丹徒网站建设咨询/影响关键词优化的因素
硬件平台:飞思卡尔IMX6 内核版本:kernel3.0.35 问题来源: 开发板的默认显示方式是FPC接口800*480的屏,本项目中用到的屏是工业级的1024*768接口的LVDS屏,更换屏之后,除了移植相应的屏驱动和触摸驱动之外&…...
苏州免费推广的网站/百度网盘app下载
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创见函数,这被叫做用户自…...