【经验】几种数据库优化技巧

news/2024/12/21 17:12:20/文章来源:https://www.cnblogs.com/longfurcat/p/18620916

1.分表思想

对于查询操作来说,表中数据越少,查询速度通常越快。因此,优化的方向就是将不相关的数据分离到其他表中。

案例 1:活跃数据与历史数据分表

如果系统的大部分业务操作集中在“活跃”数据上,可以考虑将数据划分为活跃数据表和历史数据表:

  • 活跃数据表:包含当前常用的数据,数据量较少,但读写操作频繁。
  • 历史数据表:存储较少查询的数据,数据量大,但查询频率低。

通过分表,能有效提高查询效率,减少活跃数据表的负担。

案例 2:基于用户ID分表

当系统涉及大量用户的私有数据时,可以根据用户ID进行分表。通过哈希算法将用户数据均匀分布到多个表中,例如分成10张表,按用户ID进行哈希分配。这样可以保证每个表中的数据量相对均衡,提高查询性能。


2. 监控慢查询

Mysql CPU占用高,通常是慢查询导致的。可以通过记录慢查询日志发现哪些查询语句不符合预期,导致了系统性能下降。

1.修改mysql的配置文件,开启慢查询日志。(建议在测试环境中开启并进行压测)

[mysqld]
slow_query_log = 1              # 开启慢查询日志
slow_query_log_file = /path/to/your/slow_query.log  # 慢查询日志文件路径
long_query_time = 1            # 设置慢查询的阈值,单位为秒(这里是 1 秒)

2.通过分析慢查询日志,定位性能瓶颈,进行优化。


3. 监控SQL执行数量

有时候慢查询日志不多,但是mysql的CPU占用却很高。那有可能是大量的快查询堆积出来的。通过检查统计数据,可以判断有哪些查询是不符合预期的。

1.清空统计数据

TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;

2.压力测试结束后查看统计数据

SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 100;

案例:JPA的@NotFound(action = NotFoundAction.IGNORE)导致懒加载数据被提前加载

使用JPA通常使用懒加载来关联数据,但是如果用了上面的注解,就会导致懒加载失效,数据被提前加载,产生很多额外的select by id的SQL查询。


4.一致的修改顺序,防止死锁

假设业务操作①和业务操作②,都需要修改A,B,C。那么不一致的修改顺序,就可能导致死锁。

死锁示例:

  • 操作①:修改 A → 修改 B → 修改 C
  • 操作②:修改 B → 修改 C → 修改 A

若同时执行这两个操作,就可能发生死锁。操作①持有 A 的锁,等待 B 的锁;操作②持有 B 的锁,等待 A 的锁,最终导致死锁。

建议:定义统一的实体修改顺序

为了避免死锁,建议在系统中定义一个实体的修改顺序规则,并确保所有业务操作都遵循该规则。例如:

  • 在所有操作中,始终按照 A -> B -> C 的顺序修改这些实体。
  • 通过约定的顺序,确保即使多个操作并发执行,也不会产生互相等待锁的情况,从而避免死锁。

5. 查询优化器未必靠谱,强制使用索引

Mysql有查询优化器,但是查询优化器有时候不靠谱。比如某个字段有索引,查询条件也用到了。但是它不用这个索引,导致全表扫描。

此时,可以考虑使用 FORCE INDEX 来强制优化器选择某个索引。

验证方式:可以导入测试数据,通过执行 EXPLAIN [SQL],你可以查看优化器是否正确选择了索引。


6. 批次入库思想

批量插入数据是提高效率的常见做法。但批量操作未必适合所有场景。特别是当多个数据项并非来自同一个请求或操作时,可以考虑批次管理策略。

策略

  • 每次批次大小达到100条时进行入库。
  • 设置时间限制,例如1秒或2秒,无论批次是否满100条,时间到也要执行入库。

案例:Kafka的生产消费都采用批次处理

建议:合理设计批次大小和时间限制


7. 有限数据思想(Limit)

在处理定时任务或周期性查询时,限制查询的数据量是一个非常好的优化策略。例如,每次最多查询100条数据,防止一次查询返回大量数据,导致内存占用过高。

建议:在定期任务中,最好加上数据量的限制,避免一次性加载过多数据。如果数据量较大,可以考虑分页查询或分批处理。


8. 注意查询范围

在涉及时间范围的查询时,务必谨慎处理查询的时间范围。如果查询条件不明确,可能会导致全表扫描。例如,查询过期数据时,使用 expireTime < currentTime 作为条件,如果没有加上特定的时间区间,查询范围可能会过于广泛。

案例:定时任务,可以记录上一次处理的最后一个条目的时间,作为下一次查询的时间起点。

建议:在进行时间范围查询时,明确设置查询的区间,避免查询条件过于宽泛,导致性能问题。


9. 复合索引

复合索引可以显著提高查询效率,特别是在查询涉及多个字段时。它通过将多个字段组合成一个索引来加速查询。不过,需要注意的是,复合索引遵循最左前缀原则,即查询条件必须按照索引字段的顺序提供,且必须从第一个索引字段开始。如果查询条件没有从复合索引的最左边字段开始,复合索引将无法生效。

复合索引 vs 独立索引

假设每次查询都涉及到两个字段。如果为每个字段创建独立的索引,MySQL将需要分别扫描这两个索引树,并进行合并操作。而使用复合索引时,只需扫描一个索引树,大大提高了查询效率。

注意

复合索引和独立索引并不冲突。如果复合索引 IndexABC 包含字段 (A, B, C),但某些查询只需要 C 字段时,复合索引就无法生效。这时,应为 C 字段单独创建一个索引,以提高查询效率。


 10.覆盖索引

覆盖索引(Covering Index)指的是索引中的所有字段都能够满足查询的需求,也就是说,查询所需要的所有数据都可以从索引本身获得,而无需回到原始数据表去查询。

建议:当字段查询频率非常高的时候,可以考虑覆盖索引。

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

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

相关文章

软件技术基础第五次作业

.center { width: auto; display: table; margin-left: auto; margin-right: auto }班级链接 24软件技术基础(浙江理工大学)目标 搭建简易的图书管理系统网盘地址 https://pan.baidu.com/s/1lnq1AF1mG5m3BSuj1wa2xw?pwd=ds74码云地址 https://gitee.com/honeyest/library-sy…

MediaWIKI 1.42 教程系列2 — MediaWIKI 配置

接着上篇安装完Ubuntu 环境,本篇正式开始MediaWIKI 下载和配置 下载 MediaWiki 官网路径通过官网或者其他网友网盘分享的地址下载,后解压缩成文件夹,重新命名 mediawiki 文件夹,上传至或者拷贝至服务器主机。需要说明的是,官网并没有指明拷贝到何处。理论上可以放置在任何…

WideVineDRM视频解密

WideVineDRM视频解密 本文的目的只是为了能够简单的了解一下WideVineDRM 1、认识流媒体 流媒体(Streaming Media)是一种通过网络实时传输数据的技术,使用户能够在不必先下载完整文件的情况下,边接收数据边播放音频、视频或其他多媒体内容。换句话说,流媒体技术可以让我们直…

29.Python基础篇-网络基础理论

重要知识点 BS与CS架构 BS(Bro  wser/Server)架构:基于浏览器和服务器的架构,客户端通过浏览器访问服务器上的应用程序或服务。 特点:客户端只需要一个浏览器,无需安装复杂的软件,服务器端处理大部分业务逻辑。 应用:Web应用(如Web浏览器访问网站)。CS(Client/Ser…

ALibi位置编码

1.原理 ALibi( ATTENTION WITH LINEAR BIASES) 也是一种位置编码, 与在词向量中添加位置信息不同。ALibi不对词向量进行任何操作,而是在Query和Key点积之后添加一个静态的、非学习型的偏差: \(softmax(Q_iK^T + m * [-(i - 1), ..., -2, -1, 0]\),如图所示

Flash动画综合设计

Flash动画综合设计并发布、嵌入到网页【作业要求】 自己选定主题,创意制作Flash动画,并与网页进行集成 【实验环境】 l 所需硬件环境为微机; l 所需软件环境为Flash8.0 【创意内容】一、国旗飘荡效果设计思路:我选择了中国国旗作为主题,想通过动态效果让国旗看起来像在风中…

意念力

点分治 分治fft 下降幂多项式题目链接 很有道理的题。把划分集合的方案容斥一下,变成染色的方案。 再从边界情况考虑问题。 链 设当前钦定有 \(x\) 种颜色。 从前往后考虑每个点的贡献。 容易发现,它与在它之前的 k-邻域内任意一点颜色不同即可满足条件。 而它之前 k-邻域内的…

JVM专题学习之类加载器(二)

类加载器 三层类加载器 1.启动类加载器-BootstrapClassLoader AppClassLoader负责加载核心类,存放在lib目录下的jar包或class文件。 2.扩展类加载器-ExtensionClassLoader ExtensionClassLoader负责加载\lib\ext目录下的jar包或class文件,我们可以将通用性的功能,打成jar包放…

2024-2025-1 20241417 《计算机基础与程序设计》第十三周学习总结

2024-2025-1 20241417 《计算机基础与程序设计》第十三周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>2024-2025-1计算机基础与程序设计第十三周作业这个作业的目标 <复习前…

28.Python基础篇-logging模块

介绍: logging 模块是Python内置的强大日志记录工具,支持多种输出方式、格式化选项及多进程支持。 日志的级别 logging 模块有五个内置的日志级别,从低到高:DEBUG:详细信息,用于诊断问题。 INFO:常规信息,表示程序正常运行的状态。 WARNING:警告信息,表示潜在问题或即…

Redis安装配置

安装gcc环境sudo yum install -y gcc-c++查看gcc环境gcc -v

我们的电视Our tv 3.6.0安卓+TV 一款全新电视直播软件-内置稳定直播源

应用简介 我们的电视(ourtv)是一款完全无广告的电视直播软件,清晰度可选择高清,超清,蓝光等播放。安装即可使用,再也不用费劲去找各种不稳定的直播源了。 “我们的电视”播放线路(直播源)是来自央视频,因此画质和稳定性还可以。不过随之而来的问题是跟央视频 App 不兼…