共计 646 个字符,预计需要花费 2 分钟才能阅读完成。
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 语句
正文完