一条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.mzph.cn/news/720424.shtml

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

相关文章

IM聊天交友APP源码IM带音视频Uniapp即时通讯安卓苹果APP修改二开

前端开发语言&#xff1a;VUE&#xff08; 安卓&#xff0c;IOS,WEB为一套前端代码&#xff09; 服务器端开发语言: PHPWebSocket 数据库&#xff1a;MySql mongodb 前端打包工具&#xff1a;Hbuilder 服务器搭建工具&#xff1a;宝塔 Xshell 短信接口&#xff1a; 支持…

虚拟机 CentOS 7 安装

1. 新建虚拟机 2. 选择ISO映像文件 3. 开启虚拟机 进入后回车 等待至此页面&#xff0c;进行配置 软件选择 图形化界面&#xff08;可选择是否安装&#xff09; 系统分区 按需求分配大小 4. 开始安装 配置完毕后开始安装 ROOT密码 创建用户 安装完重启即可 5. 启动虚拟机 输入刚…

ARM-v7 GCC 环境下的大小端转换实现

1.前言 什么是大小端转换&#xff1f;为什么叫大小端转换&#xff1f; Jonathan Swift的《格列佛游记》中记载&#xff0c;有两国因为剥鸡蛋的方式不同&#xff0c;即一国要求将熟鸡蛋的较大的一端&#xff08;大端&#xff0c;big endian&#xff09;敲碎然后剥壳&#xff0c;…

jmeter 业务顺序执行(串行、并行)

简介 当我们在应对某些性能需求时&#xff0c;比如要求测试单个业务串行或并行的响应时间。如果直接设定线程组业务的话&#xff0c;jmeter 会将某个线程组下面的全部业务一起执行&#xff0c;在这种情况下的响应时间是不符合要求的&#xff0c;所以需要勾选指定参数或设置其他…

器件选型【电容,电阻篇】

电阻篇&#xff1a; 一句话先做总结&#xff1a;电阻的选型主要考虑额定电压和过流能力&#xff08;基于封装大小&#xff09; 电阻封装规格越大功率越大。但其功率也与温度有关&#xff0c;如果温度超过 70℃&#xff0c;其额定功率是会下降的。并且&#xff0c;R01005 和 R0…

VUE3项目学习系列--element-plus集成(三)

1、安装依赖 Element-plus官网&#xff1a;快速开始 | Element Plus (element-plus.org) pnpm i element-plus 在项目main.ts中引入element-plus: import { createApp } from "vue"; import App from "./App.vue"; // 从Element官网上参考&#xff0c;…

python识别并控制操作已打开的浏览器进行自动化测试

前提&#xff1a;已安装python和selenium 一、将浏览器以debugger模式打开 打开方法&#xff1a; 1.右击浏览器&#xff0c;选择属性&#xff1a; 2.在目标中加上 --remote-debugging-port9222 --user-data-dir"C:\selenum\AutomationProfile" 二、识别代码 from…

Java基础(5) 泛型 日期和时间 线程 File-输入流

泛型 java的泛型有点像ts的泛型 public class ArrayList<T> {private T[] array;private int size;public void add(T e) {...}public void remove(int index) {...}public T get(int index) {...} }// 创建可以存储String的ArrayList: ArrayList<String> strLis…

codeTop01:LRU (最近最少使用) 缓存的实现

问题 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; ● LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 ● int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;…

opencart3 添加速卖通商品脚本

非爬虫&#xff0c;只能把速卖通商品信息拿下来解析插入到自己的项目里。 刚接触opencart3没多久&#xff0c;有一些新项目需要添加商品&#xff0c;每次手动从速卖通复制信息又很慢&#xff0c;就自己写了一个脚本。 思路&#xff1a;速卖通商品详情页有一段数据包含了几乎所…

初识Hive

官网地址为&#xff1a; Design - Apache Hive - Apache Software Foundation 一、架构 先来看下官网给的图&#xff1a; 图上显示了Hive的主要组件及其与Hadoop的交互。Hive的主要组件有&#xff1a; UI&#xff1a; 用户向系统提交查询和其他操作的用户界面。截至2011年&…

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的按键扫描、数码管显示按键值、显示按键LED应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1638键盘…

C# WinForm AndtUI第三方库 Tree控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Tree控件至窗体。 使用方法集合 1.添加节点、子节点 using AntdUI; private void UpdateTreeView() {Tree tvwTestnew Tree();TreeItem rootTreeItem;TreeItem subTreeItem;Dictionary<str…

高级软件开发知识点

流程 算法题简历上项目用到技术、流程、遇到问题HR 准备 常考的题型和回答思路刷100算法题&#xff0c;理解其思想&#xff0c;不要死记最近一家公司所负责的业务和项目&#xff1a; 项目背景、演进之路&#xff0c;有哪个阶段&#xff0c;每个阶段主要做什么项目中技术选型…

STM32 TIM编码器接口

单片机学习&#xff01; 目录 文章目录 前言 一、编码器接口简介 1.1 编码器接口作用 1.2 编码器接口工作流程 1.3 编码器接口资源分布 1.4 编码器接口输入引脚 二、正交编码器 2.1 正交编码器功能 2.2 引脚作用 2.3 如何测量方向 2.4 正交信号优势 2.5 执行逻辑 三、编码器定时…

15-Java责任链模式 ( Chain of Responsibility)

Java责任链模式 摘要实现范例 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;为请求创建了一个接收者对象的链 责任链模式给予请求的类型&#xff0c;对请求的发送者和接收者进行解耦 责任链模式中通常每个接收者都包含对另一个接收者的引用&#xff0c…

头像剪切上传

头像剪切上传 文章说明核心Api示例源码效果展示源码下载 文章说明 本文主要为了学习头像裁剪功能&#xff0c;以及熟悉canvas绘图和转文件的相关操作&#xff0c;参考教程&#xff08;Web渡一前端–图片裁剪上传原理&#xff09; 核心Api 主要就一个在canvas绘图的操作 context…

2.8k star! 用开源免费的edge-tts平替科大讯飞的语音合成服务

edge-tts是github上的一个开源项目&#xff0c;可以免费将文本转为语音&#xff0c;别看它只有2.8k star&#xff0c;替代科大讯飞的收费TTS服务完全没问题&#xff0c;因为这个项目实际是调用的微软edge的在线语音合成服务&#xff0c;支持40多种语言&#xff0c;300多种声音&…

注意力机制(代码实现案例)

学习目标 了解什么是注意力计算规则以及常见的计算规则.了解什么是注意力机制及其作用.掌握注意力机制的实现步骤. 1 注意力机制介绍 1.1 注意力概念 我们观察事物时&#xff0c;之所以能够快速判断一种事物(当然允许判断是错误的), 是因为我们大脑能够很快把注意力放在事物…

EdgeX Foundry 安装部署

文章目录 一、概述1.官方文档2.Docker Compose 生成器3.创建 docker-compose 文件 二、安装准备1. 克隆服务器2.安装 Docker3.安装 docker-compose 三、非安全模式部署1.docker-comepse2.启动 EdgeX Foundry3.访问 UI3.1. consul3.2. EdgeX Console EdgeX Foundry # EdgeX Fou…