gorm一条慢语句分析

sixgo · · 1286 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Gorm一条慢语句分析

背景

早上被CTO @ 说是我的服务有一条语句要查询700K条数据,导致mysql记录了这条慢SQL,于是我赶紧排查原因。。。

慢SQL记录
image

定位原因

具体步骤

  1. 查看索引有trade_symbol和KEY idx_tradesymbol_side_price_timestamp (trade_symbol,side,price,timestamp)两个可以使用的索引
  2. 但是没有trade_symbol,timestamp,最终mysql选择的索引是idx_tradesymbol_side_price_timestamp ,我本地建立trade_symbol,timestamp的联合索引,并去掉SQL中的, `deals`.`id` ASC语句,发现可以解决这个问题。

image

3.很奇怪的是我查找了我的代码,所有的代码中并没有使用ID主键作为排序的条件,自动更添加了ID ASC排序。

  1. 定位代码中使用的SQL如下,发现是因为使用了First这个函数,使用Find和Limit替代之后,就不会出现这种情况了
 var result = &orm.Deal{}
 err := db.Slave().Model(&orm.Deal{}).Where("trade_symbol = ?", symbol).
 Order("timestamp desc").First(result).Error
 return result.Price, err
}

总结教训

  1. 对Gorm的实现原理没有理解
  2. 测试的时候没有把SQL日志打开,查看日志数据的具体SQL语句

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:sixgo

查看原文:gorm一条慢语句分析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1286 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传