mysql sql 优化 order by id asc limit n的bug

这个 MySQL bug 99% 的人会踩坑!


查看sql的执行计划

SET optimizer_trace="enabled=on";        // 打开 optimizer_trace
SELECT * FROM order_info where uid = 5837661 order by id asc limit 1
SELECT * FROM information_schema.OPTIMIZER_TRACE;    // 查看执行计划表
SET optimizer_trace="enabled=off"; // 关闭 optimizer_trace

解决方案

第一种:强制使用某种索引

select * from order_info force index(idx_uid_stat) where uid = 5837661 order by id asc limit 1

第二种:骗过优化器

select * from order_info where uid = 5837661 order by (id+0) asc limit 1

explain中的type

在type这一列,有如下一些可能的选项:

  • system:系统表,少量数据,往往不需要进行磁盘IO
  • const:常量连接
  • eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描
  • ref:非主键非唯一索引等值扫描
  • range:范围扫描
  • index:索引树扫描
  • ALL:全表扫描(full table scan)

这个文章写的有问题,key是primary是主键索引,不是全表扫描


作者:spike

分类: Mysql

创作时间:2023-06-25

更新时间:2024-12-09

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1