首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
Mysql
›
线上sql执行慢,分享3个优化案例
返回列表
发新帖
线上sql执行慢,分享3个优化案例
[复制链接]
发表于 2023-3-20 02:21:35
|
显示全部楼层
|
阅读模式
前段时间,博主线上项目的几个后端接口执行耗时达到了三、四秒钟以上,查看接口
代码
,发现 sql 语句执行过慢,于是开始分析 sql 执行 这里把比较经典的优化案例分享给大家。
本文所讲述 MySql 8.0+
代码
演示地址:
https://github.com/wayn111/newbee-mall-pro
博主github地址:
https://github.com/wayn111
欢迎大家关注,点个star
一、or 查询条件错误
线上有一个第三方账户扫码绑定手机号登录的接口,这个接口正常逻辑如下:
使用 苹果、QQ、微信获取扫描客户端登录二维码,获取用户第三方账户唯一ID后。
判断第三方账户ID是否存在用户表中,存在且已绑定手机号则直接返回用户 token 进行登录操作。
不存在则提示用户进行绑定手机号操作。
用户填写手机号及短信验证码后,进行第三方账户唯一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秒就正常了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
回复
使用道具
举报
返回列表
羊蹓狼
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表