接口优化笔记

索引

添加索引

where条件的关键自动或者order by后面的排序字段可以添加索引加速查询

索引只能通过删除+新增进行修改,无法直接修改。

# 查看表的索引
show index from `table_name`;
show create table `table_name`;
# 添加索引
alter table `table_name` add index idx_name(name);
create index idx_name on `table_name` (name);
# 删除索引
alter table `table_name` drop index idx_name;
drop index idx_name on `table_name`;
索引是否生效

添加的索引,并不一定会生效,可以通过explain查看SQL的执行计划。

EXPLAIN SELECT * FROM zz_user WHERE user_id = '1';

在这里插入图片描述
在这里插入图片描述

索引失效原因
在这里插入图片描述

选错索引

SQL优化

在这里插入图片描述

远程调用

并行调用

当一个接口中调用的多个远程方法之间没有先后依赖顺序时,可以使用并行调用,这样整个接口的耗时就会以最长耗时的远程为主。比如要查询一个人的全量信息,而这个人的全量信息保存在不同的服务中,比如用户服务、积分服务、成长值服务中时,可以通过一个关键数据,比如用户的id同时去这三个服务中进行查询,查询后进行汇总。这样就可以减少接口总耗时。

数据异构

可以通过数据冗余,将用户服务、积分服务、成长值服务三个服务中的数据统一放到一个地方,比如redis中,这样就可以减少远程调用的次数了。

但因为数据被存储在了两个不同的地方,数据进行更新时,就会因为更新时间问题导致数据的不一致性出现。

重复调用

循环查询数据库

当需要查询一批用户的信息时,很大程度上会去遍历用户信息关键字的集合,通过对每一个关键字查询一次数据库,将查询到的数据进行汇总。这样会因为网络、数据库的连接、验证等操作耗费很多的时间。可以对这批用户集合进行批量查询。只需要远程调用一次,就可以查询出所有的数据。批量查询的记录条数要有限制,最好控制在500以内。oracle的in关键字最多只能放1000个关键字

死循环

避免因为退出条件的判断出错导致循环无法结束。

无限递归

在进行递归处理时,如果一个节点的子节点指向了它的父节点导致形成了一个循环,这样就会出现无限递归,出现栈溢出。

异步处理

对于一个接口中的非业务操作,比如用户操作记录、积分记录等不需要实时处理看到结果的,可以进行异步处理,减轻系统的压力,加快业务操作的响应

线程池

可以使用线程池进行非业务操作的处理,但可能会因为操作的异常、服务的异常(重启)导致操作的丢失,造成数据的丢失。

mq

可以将非业务操作放入到mq服务中,通过mq的高可用以及幂等重试保证操作的完整性。

避免大事务

在这里插入图片描述

  1. 少用@Transactional注解
  2. 将查询(select)方法放到事务外
  3. 事务中避免远程调用
  4. 事务中避免一次性处理太多数据
  5. 有些功能可以非事务执行
  6. 有些功能可以异步处理

锁粒度

synchronized
redis分布式锁
数据库分布式锁

分页处理

当要查询的数据量比较大时,可能会因为网路宽度的原因,导致查询的出现。查询的数据很多时,页面上也无法一次性展示,此时可以通过分页,减少一次性查询的数据库。也可以在多次查询后,将查询后的数据进行汇总。

缓存

redis缓存
二级缓存

分库分表

分库解决数据库连接资源不足问题和磁盘io的性能瓶颈问题

分表解决单表数据量太大,SQL语句查询数据时,即时走了索引也非常耗时的问题,此外也可以解决cpu资源问题。

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

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

相关文章

C/C++开发---全篇

1、统筹 学习目标: C/C、python精通。 就业匹配方向:专精一个领域,延长职业生涯。 (1)适配行业; (2)量化; (3)安全; (4&…

华为od统一考试B卷【比赛】python实现

def split_params(param_str): return list(map(int, param_str.split(,))) def main(): # 获取输入 target_str input().strip() # 输入验证,拆分并转换为整数 try: m, n split_params(target_str) except ValueError: print(-1) return # 检查 M 和 …

react的pdf转图片格式上传到后端

这个东西做的我真的是头昏脑涨 主要需求是,upload上传pdf,pdf转图片格式展示,以图片格式上传到后端 封装了组件代码 父组件直接放就可以了 使用的插件pdfjs-dist,版本是 "pdfjs-dist": "2.5.207", impor…

高性能跨平台网络通信框架 HP-Socket v6.0.2

项目主页 : http://www.oschina.net/p/hp-socket开发文档 : https://www.docin.com/p-4592706661.html下载地址 : https://github.com/ldcsaa/HP-SocketQQ Group: 44636872, 663903943 v6.0.2 更新 一、主要更新 优化Linux通信组件多路复用处理架构,避免“惊群”问…

计算机的错误计算(六十三)

摘要 计算机的错误计算(五十六)探讨了大数的正切函数值的错误计算。本节讨论大数的余切函数的计算精度问题。 例1. 已知 计算 不妨用 3种方法计算。 (1) 在 Python 中利用 直接贴图: (2) 在 Java 中利用 若运行下列代码 import ja…

高密度互连HDI

HDI(High Density Interconnector,高密度互连)是一种先进的PCB技术,在有限的空间内,通过使用微细过孔和精细的布线来提高电路板的集成度。 特点: 微细过孔(Microvias):…

城V4系列版本开源前后端uniapp代码

本文来自:智慧同城V4系列版本开源前后端uniapp代码 - 源码1688 应用介绍 演示地址:https://tongchengsaas.88881111.icu/ 账号:ceshi 密码:12345678 前端演示: 测试环境 php7.2mysql5.6ningx 安装拓展 ioncube&#x…

来看看设计日志组件SDK的基操

一、总览 设计一个日志组件来监控业务中的流程节点;我们需要分三步; 获取数据整理数据上传数据 二、获取数据 日常项目中使用的日志组件有:logback log4j: 优点:成熟稳定,灵活性高,性能良好&#xff0…

Windows平台RTSP|RTMP播放器如何实时调节音量

我们在做Windows平台RTSP、RTMP播放器的时候,有这样的技术需求,特别是多路监控的时候,并不是每一路audio都需要播放出来的,所以,这时候,需要有针对音量调节的设计: /** smart_player_sdk.cs* C…

★ C++基础篇 ★ 栈和队列

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C基础篇第八章----栈和队列 ~ 目录 一 容器适配器 二 deque的简单介绍 2.1 deque的原理介绍 2.2 deque vector list 的优缺点 2.2.1 vector 2.2.2 list 2.2.3 deque 2.3 为什么选择deq…

ECMAScript性能优化技巧与陷阱

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 ECMAScript&#xff0c;即JavaScript&#xff0c;是一种广泛应用于Web开发中的脚本语言。随着现代Web应用的复杂度日益增加&#xff0c;如何优化JavaScript的性能变得至关重要。性能优化不仅能提高应用的响应速度&#x…

排序算法【冒泡排序】

一、原理 冒泡排序的原理比较简单&#xff0c;就是将待排序区域的数值挨个向后对比&#xff0c;直到比较到已排序的边界&#xff0c;就纳入已排序区域。 二、代码如下所示&#xff1a; #include <stdio.h> #include "test.h"/* 冒泡排序 */ void bubble_sort(…

【JavaEE】深入浅出:Spring Boot配置文件全解析

目录 SpringBoot 配置⽂件配置⽂件作⽤SpringBoot配置⽂件 配置⽂件快速⼊⼿配置⽂件的格式properties 配置⽂件说明properties 基本语法读取配置⽂件properties 缺点分析 yml 配置⽂件说明yml 基本语法yml 使⽤进阶yml 配置不同数据类型及 null配置对象配置集合配置Map yml优缺…

NVDLA专题1:NVDLA框架介绍

NVDLA概述 深度学习的计算部分主要可以分为4部分&#xff1a;卷积、激活单元&#xff08;神经元&#xff09;、池化和归一化。由于每个运算模块都有比较独特的共享特征&#xff0c;因此非常适合给每个模块设计一个对应的特殊硬件实现&#xff1a;内存访问模式容易预测并且很容…

边缘智能:让每一个温室都成为计算中心

&#xff08; 于景鑫 国家农业信息化工程技术研究中心&#xff09;当人工智能的浪潮席卷全球&#xff0c;大语言模型&#xff08;LLM&#xff09;引领智能风潮之时&#xff0c;"智慧农业"也摩拳擦掌跃跃欲试。设施农业作为现代农业的翘楚&#xff0c;正站在数智化变革…

社交媒体分析:如何利用Facebook的数据提升业务决

在数字化时代&#xff0c;社交媒体已经成为企业战略中不可或缺的一部分。Facebook&#xff0c;作为全球最大的社交平台之一&#xff0c;提供了丰富的数据资源&#xff0c;这些数据不仅能够帮助企业了解市场趋势&#xff0c;还能提升业务决策的精准度。本文将探讨如何有效利用Fa…

四路一体行车记录仪,语音提示注意行人,保障车辆行驶安全

在叉车、货车、客车等行业中&#xff0c;随着运输业务量的不断增加&#xff0c;行车安全问题已经成为了一大难题。经常会发生车祸、司乘人身安全无保障、货物损失等意外情况&#xff0c;这些事件不仅会给企业带来经济损失&#xff0c;也会影响对应行业的整体形象。 如何提高运…

深入了解指针(7)

文章目录 1.qrost的使用2.qrost函数的模拟实现 1.qrost的使用 qrost—库函数—可以实现任意数据类型的快速排序。 void qsort(void* base, //base中存放的是待排序数组的第一个元素的地址 size_t num, //num存放的是base指向的数组中的元素个数 size_t size, //size是base指向…

《学会 SpringBoot 系列 · spring.factories 详解》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

mysql 物理备份 MySQL 全量备份 增量备份 差异备份 日志备份万字长文 1.3万字

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循版权协议&#xff0c;转载请附上原文出处链接和本声明 注意&#xff0c;通常 完备增备&#xff0c;日志&#xff08;binlog)备&#xff0c;结合使用 差异则根据具体情况选用。 此备份过程 属于公司 常用的单个数据…