一条SQL引起的系统不可用

一.前言

最近在运维系统,系统对客端突然报了403错误,从后台看发现了大量的慢SQL,导致查询超时,仔细分析我从来没见过那么厚颜无耻的SQL,一条SQL语句关联了一个大表(6000数据)查询了10次。我也很少见过一个SQL语句写了500多行。将一个很大的任务放在一个SQL里计算。以前能跑得起来是因为数据量少,现在表的数据量增加到6000万。性能急剧下降。

二、慢SQL分析(没见过如此厚颜无耻的SQL)

selectcount(1) as cnt,user_tag_user_life_period as label_value,'user_tag_user_life_period' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_user_life_period
havinguser_tag_user_life_period is not nulland user_tag_user_life_period <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_level_name_taxfree as label_value,'user_tag_level_name_taxfree' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_level_name_taxfree
havinguser_tag_level_name_taxfree is not nulland user_tag_level_name_taxfree <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_level_name_travel as label_value,'user_tag_level_name_travel' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_level_name_travel
havinguser_tag_level_name_travel is not nulland user_tag_level_name_travel <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_level_name_hotel as label_value,'user_tag_level_name_hotel' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_level_name_hotel
havinguser_tag_level_name_hotel is not nulland user_tag_level_name_hotel <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_taxfree_and_travel_sex as label_value,'user_tag_taxfree_and_travel_sex' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_taxfree_and_travel_sex
havinguser_tag_taxfree_and_travel_sex is not nulland user_tag_taxfree_and_travel_sex <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_taxfree_and_travel_user as label_value,'user_tag_taxfree_and_travel_user' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_taxfree_and_travel_user
havinguser_tag_taxfree_and_travel_user is not nulland user_tag_taxfree_and_travel_user <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_taxfree_and_hotel_sex as label_value,'user_tag_taxfree_and_hotel_sex' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_taxfree_and_hotel_sex
havinguser_tag_taxfree_and_hotel_sex is not nulland user_tag_taxfree_and_hotel_sex <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_taxfree_and_hotel_user as label_value,'user_tag_taxfree_and_hotel_user' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_taxfree_and_hotel_user
havinguser_tag_taxfree_and_hotel_user is not nulland user_tag_taxfree_and_hotel_user <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_last_year_amount as label_value,'user_tag_last_year_amount' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_last_year_amount
havinguser_tag_last_year_amount is not nulland user_tag_last_year_amount <> ''
order bycnt desc
limit1
union all
selectcount(1) as cnt,user_tag_last_year_frequency as label_value,'user_tag_last_year_frequency' as label_english
fromdata_tag.tag_user_attribute_all
whereone_id global in (selectone_idfromdata_dwd.big_table finalwhere((casewhen reg_time_taxfree is not null then 1else 0end) + (casewhen reg_time_hotel is not null then 1else 0end) + (casewhen reg_time_travel is not null then 1else 0end) + (casewhen reg_time_invest is not null then 1else 0end)) >= 2)
group byuser_tag_last_year_frequency
havinguser_tag_last_year_frequency is not nulland user_tag_last_year_frequency <> ''
order bycnt desc
limit 1;

这个SQL引发系统403,

一个重要设计缺陷是查询频繁。

第二个是这个查询放在对客端的微服务中开启了线程,这种设计严重影响对客端的性能和流畅度,这种业务应放在后台管理系统计算,而不是对客端。

第三、就是这个业务没有进行分解,是个大业务SQL 。

第四、这是一个无耻不考虑后果的SQL。没有考虑到单表数据量的暴增。

三、如何解决慢SQL和避免慢SQL

解决慢SQL(慢查询)和避免慢SQL是数据库优化中的关键任务。以下是一些建议和方法,可以帮助你解决和避免慢SQL:

1. 优化查询语句

  • 使用索引:确保查询中使用的字段都已经建立了索引,这可以大大提高查询速度。
  • **避免SELECT ***:只选择需要的字段,而不是选择所有字段。
  • 使用连接(JOIN)代替子查询:当可能时,使用JOIN操作代替子查询。
  • 优化WHERE子句:避免在WHERE子句中使用函数或计算,这会导致索引失效。

2. 优化数据库设计

  • 正规化:通过正规化来减少数据冗余。
  • 反正规化:在某些情况下,为了查询性能,可以故意引入一些冗余。
  • 分区:将大表分区,可以提高查询性能。

3. 优化数据库配置

  • 调整缓存大小:根据工作负载调整数据库的缓存大小。
  • 调整I/O性能:确保数据库服务器有足够的I/O性能。
  • 监控和调整并发连接数:根据实际需要调整最大并发连接数。

4. 使用分析工具

  • 慢查询日志:启用数据库的慢查询日志功能,找出执行时间长的查询。
  • EXPLAIN计划:使用EXPLAIN语句查看查询的执行计划,找出性能瓶颈。

5. 硬件和存储优化

  • 使用更快的存储:例如,使用SSD替代HDD。
  • 增加内存:为数据库服务器增加更多的内存。
  • 优化I/O配置:确保I/O子系统(如RAID配置)是最优的。

6. 避免常见错误

  • 避免在循环中执行查询:这会导致大量的数据库连接和查询。
  • 避免使用LIKE操作符进行前缀模糊匹配:这会导致全表扫描。

7. 定期维护

  • 更新统计信息:定期更新数据库的统计信息,以便优化器做出更好的决策。
  • 重建索引:定期重建或优化索引,保持其性能。

8. 考虑使用缓存

  • 查询缓存:某些数据库支持查询缓存,可以考虑启用。
  • 外部缓存:如Redis或Memcached,用于缓存热点数据。

9. 考虑分布式解决方案

  • 读写分离:将读操作和写操作分离到不同的服务器上。
  • 分片:将数据分布到多个数据库服务器上。

10. 持续监控和学习

  • 监控数据库性能:使用监控工具持续监控数据库性能。
  • 持续学习:数据库技术和最佳实践在不断变化,保持学习是关键。

 四、常见SQL优化方法

常见的SQL优化方法包括以下几个方面:

  1. 选择特定字段:尽量避免使用SELECT *,而是选择你真正需要的具体字段。这样可以减少不必要的数据传输和处理,从而提高查询效率。

  2. 使用索引:确保查询中使用的字段都已经建立了索引。索引可以大大提高查询速度,因为数据库可以快速定位到数据而不需要全表扫描。

  3. 优化WHERE子句

    • 避免在WHERE子句中使用函数或计算,因为这会导致索引失效。
    • 尽量避免使用OR来连接条件,因为当OR两边的字段不是索引字段时,查询可能不走索引。
    • 尽量避免在索引列上使用MySQL的内置函数。
  4. 优化JOIN操作:优先使用INNER JOIN,如果是LEFT JOIN,确保左边表的结果集尽量小。

  5. 使用LIMIT:当只需要一条或少数几条记录时,使用LIMIT来限制返回的结果集大小。

  6. 优化LIKE查询:尽量避免使用前缀模糊查询(如LIKE '%li%'),因为它会导致全表扫描。如果可能,尽量使用后缀模糊查询(如LIKE 'li%')。

  7. 避免使用子查询:当可能时,使用JOIN操作代替子查询。

  8. 优化排序操作:如果排序字段没有用到索引,尽量减少排序操作。

  9. 考虑表的设计:正规化和反正规化可以影响查询性能。确保你的表设计是合理的,并且考虑了查询性能。

  10. 使用分析工具:利用数据库的慢查询日志功能和EXPLAIN计划来找出性能瓶颈。

  11. 硬件和存储优化:确保数据库服务器有足够的硬件资源,如内存和I/O性能。使用更快的存储,如SSD,也可以提高性能。

  12. 避免常见错误:例如,避免在循环中执行查询,这会导致大量的数据库连接和查询。

  13. 定期维护:更新统计信息,重建或优化索引,以保持数据库性能。

  14. 考虑使用缓存:例如,使用查询缓存或外部缓存(如Redis或Memcached)来缓存热点数据。

  15. 持续监控和学习:使用监控工具持续监控数据库性能,并随着技术和最佳实践的发展保持学习。

结合这些策略和方法,你可以有效地优化SQL查询,提高数据库性能。

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

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

相关文章

2024年第二届智能制造与自动化前沿国际会议 | Ei、Scopus双检索

会议简介 Brief Introduction 2024年第二届智能制造与自动化前沿国际会议&#xff08;CFIMA 2024&#xff09; 会议时间&#xff1a;2024年8月23 -25日 召开地点&#xff1a;中国包头 大会官网&#xff1a;www.cfima.org 随着全球新一轮科技革命和产业变革突飞猛进&#xff0c;…

LeetCode 刷题 [C++] 第3题.无重复字符的最长子串

题目描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 题目分析 可以使用滑动窗口加哈希表来实现&#xff1a; 使用start和end两个变脸来表示滑动窗口的头部位置和尾部位置&#xff0c;两者开始均为0&#xff1b;借助哈希表来记录已经遍…

JVM(类加载机制)

类加载就是 .class 文件, 从文件(硬盘) 被加载到内存(元数据区)中的过程 类加载的过程 加载: 找 .class 文件的过程, 打开文件, 读文件, 把文件读到内存中 验证: 检查 .class 文件的格式是否正确 .class 是一个二进制文件, 其格式有严格的说明 准备: 给类对象分配内存空间 (先在…

专业140+总430+电子科技大学858信号与系统考研经验成电电子信息与通信工程,电科大,真题,大纲,参考书。

今年考研成绩出来&#xff0c;初试专业课858信号与系统140&#xff0c;总分430&#xff0c;其余各门分数都比较平稳&#xff0c;总分好于自己估分&#xff0c;应群里很多同学要求&#xff0c;我总结一下自己的复习经验。首先我是一个大冤种&#xff0c;专业课资料学长给了一套&…

uniapp实现---类似购物车全选

目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 四、小结 注意事项 一、实现思路 点击商家复选框&#xff0c;可选中当前商家下的所有商品。点击全选&#xff0c;选中全部商家的商品 添加单个多选框&#xff0c;在将多选…

react tab选项卡吸顶实现

react tab选项卡吸顶实现&#xff0c;直接上代码&#xff08;代码有注释&#xff09; tsx代码 /* eslint-disable react-hooks/exhaustive-deps */ import React, { useEffect, useState } from "react"; import DocumentTitle from react-document-title import s…

UE5中实现后处理深度描边

后处理深度描边可以通过取得边缘深度变化大的区域进行描边&#xff0c;一方面可以用来做角色的等距内描边&#xff0c;避免了菲尼尔边缘光不整齐的问题&#xff0c;另一方面可以结合场景扫描等特效使用&#xff0c;达到更丰富的效果&#xff1a; 后来解决了开启TAA十字线和锯齿…

Java零基础 - 数组的定义和声明

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

AI预测福彩3D第4弹【2024年3月7日预测】

经过前面几次的预测&#xff0c;7码命中率已经有了明显提高&#xff0c;今天&#xff0c;继续咱们的预测。 老规矩&#xff0c;先给各位展示下百十个的神经网络蒙特卡洛统计频次图及部分号码的冷温热走势图。 最终&#xff0c;经过研判分析&#xff0c;2024年3月7日福彩3D的七…

人工蜂群算法

人工蜂群算法 人工蜂群算法&#xff08;Artificial Bee Colony Optimization,ABC&#xff09;是一种基于蜜蜂觅食行为的优化算法&#xff0c;由土耳其学者Karaboga于2005年提出&#xff0c;算法模拟蜜蜂的采蜜行为对优化问题进行求解。 算法原理 ABC算法的核心思想是将优化问…

C#中实现接口的一些小知识(C#用abstract或virtual来实现接口成员)

文章目录 不可用的修饰可用的修饰非抽象类实现接口抽象类实现接口抽象类与接口方法同名时一同实现 不可用的修饰 在C#中实现接口时&#xff0c;我们不能直接使用static或const来实现接口成员&#xff0c;因为接口中的成员默认都是实例成员&#xff0c;并且它们表示一种契约&am…

Go语言物联网开发安科瑞ADW300/4G电能表数据上传mqtt平台-电表接线到传输数据完整流程

电能表功能说明 ADW300是方便用户进行用电监测、集抄和管理&#xff0c;可灵活安装在配电箱中&#xff0c;可用于电力运维、环保监管等在线监测类平台中。我们本案例是用于工业售电公司对出售电的管理&#xff0c;设备可以监控用电情况、故障监控及警报&#xff0c;售电公司可…

灵魂指针,教给(二)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组…

JavaWeb笔记 --- 一JDBC

一、JDBC JDBC就是Java操作关系型数据库的一种API DriverManager 注册驱动可以不写 Class.forName("com.mysql.jdbc.Driver"); Connection Statement ResultSet PrepareStatement 密码输入一个SQL脚本&#xff0c;直接登录 预编译开启在url中 数据库连接池

SpringBoot+Vue实现el-table表头筛选排序(附源码)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;在笑大学牲 &#x1f39f;️个人主页&#xff1a;无所谓^_^ ps&#xff1a;点赞是免费的&#xff0c;却可以让写博客的作者开心好几天&#x1f60e; 前言 后台系统对table组件的需求是最常见的&#xff0c;不过element-ui的el…

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一&#xff0c;为什么需要智能指针 二&#xff0c;内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3&#xff0c;如何避免内存泄露 三&#xff0c;智能指针的使用与原理 1. RAII思想 2. 智能指针 &#xff08;1. unique_ptr &#xff08;2. shared_…

吴恩达deeplearning.ai:机器学习项目的完整周期伦理

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 语音识别部署公平、偏见、伦理 这节博客中&#xff0c;我们主要看看构建一个机器学习的完整周期是什么&#xff0c;也就是说&#xff0c;当你想构建一个有价值的机器学习系统时&am…

FPGA IBUFG

IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接&#xff0c;与普通IO和其它内部CLB等没有物理连接。 所以&#xff0c;IBUFG输入的不能直接接另外信号。 GTH transceiver primitives are called GTHE3_COMMON and GTHE3_CHANNEL in UltraScale FPGAs, an…

【PyTorch】进阶学习:探索BCEWithLogitsLoss的正确使用---二元分类问题中的logits与标签形状问题

【PyTorch】进阶学习&#xff1a;探索BCEWithLogitsLoss的正确使用—二元分类问题中的logits与标签形状问题 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、Py…

[C语言]——分支和循环(4)

目录 一.随机数生成 1.rand 2.srand 3.time 4.设置随机数的范围 猜数字游戏实现 写⼀个猜数字游戏 游戏要求&#xff1a; &#xff08;1&#xff09;电脑自动生成1~100的随机数 &#xff08;2&#xff09;玩家猜数字&#xff0c;猜数字的过程中&#xff0c;根据猜测数据的⼤…