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

接口优化笔记

索引

添加索引

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资源问题。

相关文章:

  • ThinkPHP5漏洞分析之代码执行
  • LeeCode Practice Journal | Day44_DP11 子序列问题
  • 案例分享—国外毛玻璃效果UI设计案例
  • UE5学习笔记11-为拿取武器添加动画
  • 派森学长带你学python—集合
  • 爬虫 Web Js 逆向:RPC 远程调用获取加密参数(1)WebSocket 协议介绍
  • C++简单界面设计
  • 【初阶数据结构】通讯录项目(可用作课程设计)
  • 突破传统看车局限,3DCAT实时云渲染为东风日产奇骏赋能
  • Django 安装指南
  • ui自动化难点
  • UE5学习笔记9-创建一个小窗口提示人物是否和武器重叠
  • 【人工智能】Transformers之Pipeline(十):视频分类(video-classification)
  • C语言常用的数据结构
  • Python | Leetcode Python题解之第331题验证二叉树的前序序列化
  • [deviceone开发]-do_Webview的基本示例
  • [LeetCode] Wiggle Sort
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Android 架构优化~MVP 架构改造
  • Android优雅地处理按钮重复点击
  • docker容器内的网络抓包
  • Elasticsearch 参考指南(升级前重新索引)
  • git 常用命令
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • MD5加密原理解析及OC版原理实现
  • quasar-framework cnodejs社区
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • Vue 2.3、2.4 知识点小结
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于字符编码你应该知道的事情
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端js -- this指向总结。
  • 小程序开发之路(一)
  • 一些关于Rust在2019年的思考
  • 怎样选择前端框架
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • HanLP分词命名实体提取详解
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (19)夹钳(用于送货)
  • (Git) gitignore基础使用
  • (Oracle)SQL优化技巧(一):分页查询
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (七)Knockout 创建自定义绑定
  • (四)鸿鹄云架构一服务注册中心
  • (算法)区间调度问题
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)创业的注意事项
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?