通一个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;【慢】
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

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

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 走了全表扫描,所以慢
1年前 评论
renxiaotu 1年前
高延迟战神 1年前
讨论数量: 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 走了全表扫描,所以慢
1年前 评论
renxiaotu 1年前
高延迟战神 1年前

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

1年前 评论

使用explain看下执行计划,详细可以看下这里:

博客:一文详解Mysql优化中explain各字段含义

1年前 评论

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

1年前 评论

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

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 走了全表扫描,所以慢
1年前 评论
renxiaotu 1年前
高延迟战神 1年前

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

1年前 评论
laisxn

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

1年前 评论

bike_id加个索引试试?

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!