关于mysql:gorm一条慢语句分析

Gorm一条慢语句剖析

背景

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

慢SQL记录

定位起因

具体步骤

  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语句,发现能够解决这个问题。

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语句

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理