因为在公司业务中遇到了这个问题,所以写了这篇博客来记录出现问题的原因和修复方法。

MySQL Logo

原因

MySQL 5.6 在使用有 ORDER BYLIMIT 语句的查询时,如果数据不够 LIMIT,就会直接全索引扫描。

而 GORM 的 First() 方法也会嵌入这两种语句,如:SELECT * FROM users ORDER BY id LIMIT 1;

这样就造成了比较难排查的慢查询问题。

修复

  • 因为问题只出现在 MySQL 5.6,所以可以升级或降级;
  • 对于业务上有用到 ORDER BYLIMIT 语句的逻辑,考虑不用或放到内存中排序;
  • 对于业务上需要任意取一行的逻辑,不要使用 GORM 的 First() 方法,而是手动实现。

参考链接

MySQL Bugs: #78993: Optimizer use index scan instead of range scan by mistake

查询