首页 > 数据库 >线上sql执行慢,分享3个优化案例

线上sql执行慢,分享3个优化案例

时间:2023-03-19 22:02:10浏览次数:51  
标签:案例 num 线上 sql new 执行 id stock

前段时间,博主线上项目的几个后端接口执行耗时达到了三、四秒钟以上,查看接口代码,发现 sql 语句执行过慢,于是开始分析 sql 执行 这里把比较经典的优化案例分享给大家。

一、or 查询条件错误

线上有一个第三方账户扫码绑定手机号登录的接口,这个接口正常逻辑如下:

  1. 使用 苹果、QQ、微信获取扫描客户端登录二维码,获取用户第三方账户唯一ID后。
  2. 判断第三方账户ID是否存在用户表中,存在且已绑定手机号则直接返回用户 token 进行登录操作。
  3. 不存在则提示用户进行绑定手机号操作。
  4. 用户填写手机号及短信验证码后,进行第三方账户唯一ID与手机号的绑定,成功则返回用户 token 进行登录操作。

博主记得这个接口是在21年10月上线的,到现在经历了一年多,接口执行时间是越来越慢,初步分析是用户数量持续增长,用户表记录越来越多,导致 sql 查询执行效率越来越低导致。这里用 vc_member_bak 进行举例,表结构以及数据展示,其中 apple_id、weixn_id、qq_id 有建立索引:

vc_member_bak 表数据量在46万左右,开启日志分析后,发现是下面这条 sql 执行太慢导致:

SELECT * FROM vc_member 
WHERE qq_id = 'xxx' OR app_id = 'xxx' OR weixin_id = 'xxx' ;

执行结果:

需要1.3秒左右,这是在我本地模拟的数据,线上用户在百万级别,耗时已经达到2、3秒,于是博主开始上 explain,分析 sql 执行:

由于 explain 结果中 key 列为空,明显可知虽然 possible_keys 列有值,但是执行过程中,没有使用索引导致全表查询,从rows 列为46万可以看出已经基本接近于全表查询。

那么问题出在哪里?我们不是已经给 apple_id、weixn_id、qq_id 三个字段都添加索引了吗。

于是博主仔细查询 sql 语句发现里面有坑,查询的 where 条件上使用的三个条件字段是分别是 app_id、weixin_id、qq_id,而我们的索引字段是 apple_id、weixn_id、qq_id,很明显这是查询字段 apple_id 写成 app_id 了导致。app_id 没有加索引,所以在 or 条件查询下执行的就是全表扫描。

更改字段后执行结果:

Ok,这里发现了是查询字段写错了,那么修改查询字段正确后,查询0.18秒就正常了。

标签:案例,num,线上,sql,new,执行,id,stock
From: https://www.cnblogs.com/wayn111/p/17234487.html

相关文章

  • SQL Server开启1433端口,彻底解决方案
    SQLServer开启1433端口,彻底解决方案yaohan404关注IP属地:广东0.1782018.01.0510:34:18字数377阅读29,057环境:Windows10+SQLServer2008在用JDBC连接SQLSe......
  • 优化案例
    优化案例1:现象:最近发现几个监控用的脚本在连接监控数据库的时候偶尔会连不上,报错:Couldn'tconnecttohost:3306/tcp:IO::Socket::INET:connect:Cannotassignreque......
  • Microsoft SQL Server 2022 新特性之 T-SQL 语言增强(一)
    MicrosoftSQLServer2022已经​​正式发布​​​,可以下载使用。本文给大家介绍一下该版本中的部分 ​​T-SQL​​ 新功能。​​窗口函数​​增强新版本中的窗口函数支......
  • Microsoft SSQL Server 2022 新特性之 T-SQL 语言增强(二)
    SON函数增强新版本中的ISJSON()函数增加了一个可选参数:ISJSON(expression[,json_type_constraint])1参数json_type_constraint用于指定要测试的JSON类型,包括VA......
  • 67.Mysql的组复制
    Mysql的组复制(groupcommit)AnInnoDBoptimizationthatperformssomelow-levelI/Ooperations(logwrite)onceforasetofcommitoperations, rathertha......
  • homebrew 安装postgresql 记录
    homebrew安装记录homebrew可以更好的在mac或liunx上管理软件包,其具有以下优点:Homebrew会将软件包安装到独立目录,并将其文件软链接至/opt/homebrew。Homebrew......
  • Mac+Python3环境安装mysqlclient包:OSError: mysql_config not found
    Django默认使用了sqlite数据库,实际过程中往往使用其他数据库,例如mysql。Django项目连接MySQL数据库必须要安装相应的驱动包,由于是Python3所以这里使用了mysqlclient包。......
  • 备份 MySQL 中的用户和权限
    概述有两种简单的方法可以只备份MySQL中的用户和权限解决方案1-使用mysqlpump实用程序(作为创建用户和授权语句)[shell~]$mysqlpump-uUSER-p--exclude-database......
  • 了解SQL Server 2022的最新功能和未来规划
    微软已经正式发布了备受期待的SQLServer2022,乍一看,它更像是在为Azure推销产品。对安全性和性能特性进行改进,以及一些对Azure更加友好的功能,SQLServer2022用户当然可以期......
  • 【转载】MySQL:多个事务更新同一行数据时,通过加行锁避免脏写的
    【转载】MySQL:多个事务更新同一行数据时,通过加行锁避免脏写的引入多个事务并发运行的时候,如果同时要读写一批数据,此时读和写事件的关系需要协调好,否则可能会有脏读、不......