Gorm一条慢语句分析
背景
早上被CTO @ 说是我的服务有一条语句要查询700K条数据,导致mysql记录了这条慢SQL,于是我赶紧排查原因。。。
慢SQL记录
定位原因
具体步骤
- 查看索引有
trade_symbol
和KEYidx_tradesymbol_side_price_timestamp
(trade_symbol
,side
,price
,timestamp
)两个可以使用的索引 - 但是没有
trade_symbol,timestamp
,最终mysql选择的索引是idx_tradesymbol_side_price_timestamp
,我本地建立trade_symbol,timestamp
的联合索引,并去掉SQL中的, `deals`.`id` ASC
语句,发现可以解决这个问题。
3.很奇怪的是我查找了我的代码,所有的代码中并没有使用ID主键作为排序的条件,自动更添加了ID ASC排序。
- 定位代码中使用的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
}
总结教训
- 对Gorm的实现原理没有理解
- 测试的时候没有把SQL日志打开,查看日志数据的具体SQL语句
有疑问加站长微信联系(非本文作者)