001. SQL慢查询排查(字段类型不一致)

news2024/10/7 2:17:53

目录

    • 一:背景
    • 二:排查过程
      • 2.1: SQL慢查询定位
      • 2.2: Python层面分析将String翻译成Int类型的原因
      • 2.3: Python进行SQL执行时间检测出现的问题
    • 三:总结

一:背景

  • 新的业务上线后, 合作部门发现我们引擎执行完, 回调他们的时间明显增大了, 让我们排查一下原因。

二:排查过程

2.1: SQL慢查询定位

  • 首先追查日志, 发现有一个SQL的执行时间大概3分钟, 因此判断是慢查询的原因导致的。

  • 执行SQL如下:

    select overdue_total from nc_cases where status=0 and uid = 12345678990; 
    
  • 检查SQL执行使用的索引, 发现没有用到 uid索引, 而是其使用了其他索引, 且扫描行数为500多万行。
    在这里插入图片描述

  • 查看uid的类型, 发现uid类型为varchar类型, 而自己使用的是数字, 因此导致索引失效。

  • 将sql改成字符串类型, 再次查看是否使用索引, 以及扫描行数, 发现使用到了uid索引 且扫描行数为7行。
    在这里插入图片描述

  • 因此, 结果应该是自己写的sql中的uid类型不对, 导致的慢查询。

2.2: Python层面分析将String翻译成Int类型的原因

  • 当前编写代码的方式, 发现即使自己%后面用的是str类型, 传进去也会变成int类型。
    sql = "select overdue_total from nc_cases where status=0 and uid = %s" % str(uid)
    rows = db.collection.select(sql)
    
  • 调整编写代码的方式, 给%s 外层再套一层单引号, 测试后发现, 运行速度大大提升了。
    	sql = "select overdue_total from nc_cases where status=0 and uid = '%s'" % str(uid)
    	rows = db.collection.select(sql)
    
  • 由于我使用的是DButils工具, 因此查询了一下官方写法
    • 官方写法中, select语句不仅仅可以传递sql, 还可以传递一个values, 这个values中传递的是什么类型, 就会自动的将什么类型写入到SQL中。
    • 例如下面的SQL, 列表中如果是字符串, 就会将这个字符串自动解析到sql语句中。这样类型不会发生改变。
    sql = "select overdue_total from nc_cases where status=0 and uid = %s"
    rows = db.collection.select(sql, ["12345678990"])
    

2.3: Python进行SQL执行时间检测出现的问题

  • 分析完问题后, 我们需要用python语句验证SQL执行的时间, 因子我写了一个脚本测试, 两个SQL的执行效率。
    sql_3 = "select overdue_total from nc_cases where status=0 and xiaoying_uid = %s " % str(12345678990)
    sql_4 = "select overdue_total from nc_cases where status=0 and xiaoying_uid = '%s' " % str(12345678990)
    
    
    start_time3 = time.time()
    rows_3 = db.collection.select(sql_3)
    end_time3 = time.time()
    print(sql_3 + " use time is {}".format(end_time3 - start_time3))
    
    start_time4 = time.time()
    rows_4 = db.collection.select(sql_4)
    end_time4 = time.time()
    print(sql_4 + " use time is {}".format(end_time4 - start_time4))
    
  • 当我运行发现, 执行的时间差别并不大, 这是为什么呢?
    在这里插入图片描述
  • 追查SQL工具的底层代码, 发现select()语句返回的是一个生成器对象, 在不遍历结果的条件下, 根本不会触发查询。
    在这里插入图片描述
  • 因此测试代码增加遍历语句
    start_time3 = time.time()
    rows_3 = db.collection.select(sql_3)
    for row in rows_3:
        overdue_total = row[0]
        print(overdue_total)
    end_time3 = time.time()
    print(sql_3 + " use time is {}".format(end_time3 - start_time3))
    
    start_time4 = time.time()
    rows_4 = db.collection.select(sql_4)
    for row in rows_4:
        overdue_total = row[0]
        print(overdue_total)
    end_time4 = time.time()
    print(sql_4 + " use time is {}".format(end_time4 - start_time4))
    
  • 最终发现时间差别很大。
    在这里插入图片描述

三:总结

  • SQL慢查询问题, 首先使用explain定位使用的索引和扫描行数。
  • python操作SQL语句的时候, 推荐使用官方标准格式。
  • pyhton调用select语句的时候, 未必SQL就一定执行了, 如果select底层封装的是返回生成器对象, 则遍历的时候真正去数据库查询数据。

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

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

相关文章

从用户到专家-Zabbix培训【优惠】通道开启

Q:我从2.0开始使用Zabbix,还用得着参加培训? A:相信我,多得是你不知道的事! Zabbix与时俱进,6.0新增了很多功能,如何快速系统掌握? 培训内容是Zabbix原厂设计的系统课…

自学软件测试从哪里开始?给还在迷茫的人一条出路

这两天和朋友谈到软件测试的发展,其实软件测试已经在不知不觉中发生了非常大的改变,前几年的软件测试行业还是一个风口,随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业,目前软件测试行业“缺口”已经基本饱和。当然&a…

JVM的垃圾回收机制GC

GC回收区域GC主要针对堆区回收,回收是以对象为单位。方法区的类对象加载后不太需要回收;栈区的释放时机确定,不必回收;程序计数器是固定内存地址,不必回收。找出垃圾的方法引用计数法(jvm未采取&#xff09…

SAP 编号范围及BUFFER缓冲

一 前言 编号范围对象(NUMBER RANGE)是SAP ERP 软件中的一个重要概念. 主要用来获取流水号. 在标准功能及自开发功能中大量使用.系统中的几乎所有对象的号码都是通过编号范围对象获取的. 二 编号范围对象的创建 事务代码SNRO 用于创建编号范围对象 三 编号范围对象的配置…

几个关键字(final、static、权限修饰符、super、this、instanceof)

Java知识点总结:想看的可以从这里进入 目录5、关键字5.1、final5.2、static5.3、 权限修饰符5.4、 super、this5.5、instanceof5、关键字 5.1、final 1、final:最终的。 修饰局部变量时赋值后不可改,修饰成员变量时必须赋初值且不可改&#x…

基于AST的babel库实现js反混淆还原基础案例荟萃

基本概念 AST简介 AST全称Abstract Syntax Tree,即抽象语法树,简称语法树(Syntax tree),树上的每个节点都表示源代码中的一种结构。 JavaScript 领域常用的 AST 解析库有 babel、esprima、espree 和 acorn 等&#…

【2023】Prometheus-先搭出来玩玩

找两台还没回收的服务器(虚拟机),使用centos7.*系统 一台作为监控端,一台作为被监控端。目录1.快速部署Prometheus服务2.快速部署被监控端加入监控端3.使用grafana作为UI展示4.导入node_exporter模板监控node节点1.快速部署Promet…

【nodejs】脚手架从零开始搭建JBD

🛎️脚手架编写 脚手架框架: bin www.js src contant.js create.js main.js package-lock.json package.json 🛠️插件安装 devDependencies & dependencies 脚本名称脚本作用commander读取版本,设定选项&#xff…

混合人机协同制造系统设计与控制中的运营管理问题:一项调查

S. Ehsan Hashemi-Petroodi , Simon Thevenin , Sergey Kovalev , Alexandre Dolgui 小于翻译摘要:能够执行多种任务的制造系统需要不同类型的资源。使用机器人的全自动系统具有高速、准确、不知疲倦和力量,但它们很昂贵。另一方面,人类工作者…

【Redis】快速入门使用

文章目录Redis初识NosqlRedis安装依赖库上传安装包并解压启动Redis桌面客户端Redis常见命令Redis通用命令String类型String的常见命令Key结构Hash类型List类型Set类型SortedSet类型Redis的Java客户端Jedis客户端快速入门连接池SpringDataRedis客户端快速入门自定义序列化String…

无法通过SSH远程登录Linux实例时的排查指引-阿里云国际

本文介绍在使用阿里云国际版云服务器实例时,通过SSH远程登录Linux系统的ECS实例时,连接失败,无法正常登录Linux实例的排查指引: SSH登录失败时没有明确的报错信息 处理流程 如果没有收到系统返回的报错信息,请根据以下…

多级缓存架构 | 黑马Redis高级篇

目录 一、多级缓存介绍 1、传统缓存的问题 2、多级缓存方案 二、JVM进程缓存 1、初始Caffeine 缓存分类 Caffeine入门 2、实现进程缓存 三、Lua脚本 1、初始Lua 2、Lua语法 数据类型 变量 循环 ​编辑 函数 条件控制 四、OpenResty 1、初始OpenResty 2、Open…

Java 定时任务详解

文章目录单机定时任务技术选型TimerScheduledExecutorServiceSpring Task时间轮分布式定时任务技术选型QuartzElastic-JobXXL-JOB单机定时任务技术选型 Timer java.util.Timer是 JDK 1.3 开始就已经支持的一种定时任务的实现方式。 Timer 内部使用一个叫做 TaskQueue 的类存…

在GCP的Kubernetes上安装dapr

1 简介 我们之前使用了dapr的本地托管模式,但在生产中我们一般使用Kubernetes托管,本文介绍如何在GKE(GCP Kubernetes)安装dapr。 相关文章: dapr本地托管的服务调用体验与Java SDK的Spring Boot整合 dapr入门与本地托管模式尝试 2 安装…

STM32开发(2)----CubeMX的安装和使用

CubeMX的安装和使用前言一、CubeMX简介二、软件安装二、软件使用HSE 和 LSE 时钟源设置时钟树配置功能引脚配置配置 Debug 选项生成工程源码总结前言 本章对STM32CubeMX的安装和使用做简单介绍 一、CubeMX简介 STM32CubeMX是一种图形化工具,它允许非常简单地配置…

C++:指针

目录 1.指针 1.1指针三要素: 1.2修饰结构体struct 1.3 Pointers of Pointers 1.4constant修饰 pointer 2.指针和数组 2.1.数组的地址是连续的 2.2pointer arithmetic:指针的代数运算 2.3指针和数组的不同 3.内存分配: 1.指针 1.1指针三要素…

内卷潮不断袭来,智己汽车主打高端市场有何胜算?

当前,新能源汽车赛道已进入白热化,2022年全年产销迈入700万辆规模,分别达到705.8万辆和688.7万辆,同比分别增长96.9%和93.4%,市占率为25.6%。在政策和市场的双轮驱动下,新能源汽车市场的竞争愈发激烈。为掌…

SpringCloudAlibaba和nacos整合sentinel的简单案例

文章目录1.简单代码1.1依赖1.2配置文件配置1.2.1项目yml配置文件1.2.2nacos配置文件1.2controller1.3 service2.sentinel下载运行3.运行验证nacos的安装部署SpringCloudAlibaba整合nacos1.简单代码 1.1依赖 SpringBoot 2.3.12.RELEASE SpringCloudAlibaba 2.2.8.RELEASE <…

自动识别查找特定的串口号 比如设备管理器中Modem属性里的串口 按这个方法可以获取设备管理器任意信息。C++

1.目标&#xff1a; 自动识别查找特定的串口号 2.注册表里搜串口号 设备管理器中所有的信息都在注册表中有&#xff0c;那么我直接在注册表里搜COM143。 搜到了这个&#xff0c;但这里有2个名称key相同的。后面193,192还是可能会变的&#xff0c;不方便精确识别。继续搜。 这…

从0到1一步一步玩转openEuler--01 openEuler操作系统介绍

1 openEuler操作系统介绍 openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云…