通过缓存+SQL修改优雅地优化慢查询

作者:Robinbin 时间:2024-01-21 12:01:16 

问题描述

单例数据库模式中,后端高并发请求多(读多写少),导致数据库压力过大,关键接口响应变慢,严重影响体验。

需求

减少接口的响应时间。

寻找解决方案

由于问题主要处在数据库压力过大的情况,采用两种优化思路优化查询过程:

  • 使用缓存分担数据库压力

  • 对查询数据库过程做优化

缓存方案

更新策略

使用Redis,虽然可以很好地减少数据库的压力,但是同时在高并发的情况下,容易出现数据不一致的情况,尤其是在更新数据的时候。

最常见的导致不一致的原因是双写操作,即高并 * 况下短时间内对数据库进行两次写操作。为了最小程度地出现这种情况,缓存在更新策略上采用先更新数据库后删除缓存的方式。

对于双写问题,在最坏情况下,写请求A在更新数据库后,被写请求B先一步更新数据库+删除缓存,然后A请求才删除缓存,也不会导致后续请求读取到错误的值。

对于先写后读,在最坏情况下,写请求A在更新数据库后,被读请求C先一步在缓存读取到旧值,然后A请求才删除缓存,也只会影响这段时间的读请求,删除后的读请求不影响。

对比其他方案(先更新缓存后更新数据库、先删除缓存后更新数据库、先更新数据库后更新缓存)在最坏情况下会导致的错误(更新数据库失败导致缓存是未知值、双写后数据库变成旧值、更新缓存失败导致缓存保存旧值)要好得多。

但是先更新数据库后删除缓存也不是完全安全的,除了上文提到的高并发下先写后读可能读到旧值外,若删除缓存失败,也有可能导致读到旧值。处理方法见下文。

缓存架构

添加缓存,势必要修改业务代码,如何配置架构才能把对代码的入侵性讲到最低,这里使用监听数据库binlog的方法,使用中间件监听mysql的日志,当出现操作时,通知专门的模块来修改缓存,做到修改缓存和业务逻辑解耦。

同时为了解决缓存删除失败的问题,当发生失败时,发送消息至消息队列传递给专门的模块进行重试删除。

中间件选择:

  • 缓存使用Redis

  • 监听binlog使用canal

  • 消息队列使用RocketMQ

架构如下所示:

通过缓存+SQL修改优雅地优化慢查询

SQL优化

查询优化可以从两个方面进行:

  • 根据高频的查询case,遵循最左匹配原则,设置对应的索引或联合索引

  • 通过了解业务场景,看看能否将一些小SQL合并成大SQL

通过本文的介绍,我们可以看到,优化慢查询并不一定需要对程序代码进行复杂的修改。通过巧妙地运用缓存和SQL优化手段,我们可以达到相同或者更好的效果。在实际的开发中,我们应该继续探索和研究这些优化方法,以提高程序的效率和稳定性。

来源:https://www.cnblogs.com/robinbin/p/17294552.html

标签:慢查询优化
0
投稿

猜你喜欢

  • python:print格式化输出到文件的实例

    2023-08-25 06:40:53
  • 轻松掌握 SQL Server 2000数据库的构架

    2009-02-05 15:50:00
  • 使用Python从有道词典网页获取单词翻译

    2022-12-10 21:18:03
  • python中的% 是什么意思,起到什么作用呢

    2021-12-12 00:20:58
  • Python面向对象之类和对象属性的增删改查操作示例

    2021-11-06 14:20:40
  • Python编程之gui程序实现简单文件浏览器代码

    2021-08-20 11:09:36
  • MySQL如何通过Navicat实现远程连接

    2024-01-13 23:07:07
  • 如何判断SQL语句是否执行了?

    2010-01-12 20:03:00
  • Vue2.0在IE11版本浏览器中的兼容性问题

    2024-04-29 13:08:55
  • pip如何用pipdeptree查看包依赖

    2022-07-28 01:56:26
  • python下的opencv画矩形和文字注释的实现方法

    2022-12-26 22:27:17
  • Mysql 取字段值逗号第一个数据的查询语句

    2024-01-23 14:29:09
  • Python matplotlib读取excel数据并用for循环画多个子图subplot操作

    2021-03-28 19:17:31
  • django2.2安装错误最全的解决方案(小结)

    2022-06-14 20:37:19
  • Python中getattr函数和hasattr函数作用详解

    2022-10-29 15:42:11
  • JS实现淘宝支付宝网站的控制台菜单效果

    2023-07-22 22:26:12
  • Python实现的爬取百度贴吧图片功能完整示例

    2021-06-30 19:22:13
  • Python实现图片滑动式验证识别方法

    2023-11-05 22:14:52
  • 查询字符串中包含特殊字符的问题

    2009-01-09 13:13:00
  • 浅谈Python数学建模之线性规划

    2021-02-11 17:57:35
  • asp之家 网络编程 m.aspxhome.com