通一个sql执行效率不一样,是为啥

Mysql 8.0.24 下数据库大概 160w 条数据#

1、select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 1 and `status` in (4, 3) order by `id` desc limit 5;#数据库里面有很多符合这个条件的数据【很快】
2、select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 531 and `status` in (4, 3) order by `id` desc limit 5;#数据库中没有符合这个条件的数据【很慢】

不知道从哪下手分析导致这样问题的原因。

执行计划#

  • 运行效果#

  • 我的分析#

  • 应该和索引和执行计划没有关系【要是有关我感觉应该是:没有数据也就没有索引,是不是全表查了;但是如果查询的时候如果没有索引咋会有数据,我感觉不用全表扫描查吧。】
    1、select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 1 order by `id` desc limit 5;#【快】
    2、select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 531 order by `id` desc limit 5;【慢】
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

没有表结构、索引, 说下我的个人看法吧, 有不对的欢迎指正

extra 显示 useing where, 应该是 bike_id 没有加索引

key 显示 primary , 走了主键索引查询, 订单表的主键应该不会命名为 bike_id


select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 1 and `status` in (4, 3) order by `id` desc limit 5; -- 数据库里面有很多符合这个条件的数据【很快】
-- 找到 bike_id = 1 , 会走了全表扫描,但是你限制了 5 条记录,查到后会直接返回,所以很快;
-- 验证方法:添加排序条件后就会变慢(猜测), 添加 order id desc|asc  , 正序倒序都试试看,不太确定哪个更快一些,还是一样快,注意要避免查询缓存哦

select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 531 and `status` in (4, 3) order by `id` desc limit 5; -- 数据库中没有符合这个条件的数据【很慢】
-- 没有找到 bike_id = 531 走了全表扫描,所以慢
2年前 评论
renxiaotu 2年前
高延迟战神 2年前
讨论数量: 9

没有表结构、索引, 说下我的个人看法吧, 有不对的欢迎指正

extra 显示 useing where, 应该是 bike_id 没有加索引

key 显示 primary , 走了主键索引查询, 订单表的主键应该不会命名为 bike_id


select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 1 and `status` in (4, 3) order by `id` desc limit 5; -- 数据库里面有很多符合这个条件的数据【很快】
-- 找到 bike_id = 1 , 会走了全表扫描,但是你限制了 5 条记录,查到后会直接返回,所以很快;
-- 验证方法:添加排序条件后就会变慢(猜测), 添加 order id desc|asc  , 正序倒序都试试看,不太确定哪个更快一些,还是一样快,注意要避免查询缓存哦

select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 531 and `status` in (4, 3) order by `id` desc limit 5; -- 数据库中没有符合这个条件的数据【很慢】
-- 没有找到 bike_id = 531 走了全表扫描,所以慢
2年前 评论
renxiaotu 2年前
高延迟战神 2年前

索引问题吧,有数据就会有索引,然后回表,否则就是扫描全表,你可以分析一下 sql,看一下是否走了索引

2年前 评论

把查询条件用 exists 子查询优化一下应该行。原因可以看下执行计划

2年前 评论

没有表结构、索引, 说下我的个人看法吧, 有不对的欢迎指正

extra 显示 useing where, 应该是 bike_id 没有加索引

key 显示 primary , 走了主键索引查询, 订单表的主键应该不会命名为 bike_id


select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 1 and `status` in (4, 3) order by `id` desc limit 5; -- 数据库里面有很多符合这个条件的数据【很快】
-- 找到 bike_id = 1 , 会走了全表扫描,但是你限制了 5 条记录,查到后会直接返回,所以很快;
-- 验证方法:添加排序条件后就会变慢(猜测), 添加 order id desc|asc  , 正序倒序都试试看,不太确定哪个更快一些,还是一样快,注意要避免查询缓存哦

select `use_bike_distance_length`, `id` from `orders` where `bike_id` = 531 and `status` in (4, 3) order by `id` desc limit 5; -- 数据库中没有符合这个条件的数据【很慢】
-- 没有找到 bike_id = 531 走了全表扫描,所以慢
2年前 评论
renxiaotu 2年前
高延迟战神 2年前

你这个没有索引导致的,使用主键索引是因为 order 排序用到呢。然后你还有个 limit 限制,有数据的话就查出来 5 个后停止全表扫描了。没有数据的记录只能全部数据扫一遍。明显前后两个数据量就不一致了

2年前 评论
laisxn

假设:bike_id = 1 只有 10w 条,bike_id = 5 150w 条 结果:即使 bike_id 有索引,150w 也会慢

2年前 评论

bike_id 加个索引试试?

2年前 评论