mysql 百万数据查询优化,join连表有无order by相差百倍!

6 篇文章 1 订阅

已知,shop_orders 已设置ctime为索引,且为时间戳储存,格式int 长度11.

如果使用ctime或者使用主键id做排序,查询速度40秒+,去掉3毫秒!

SELECT `a`.`id`,
       `a`.`ctime`,
       `a`.`status`,
       `a`.`order_id`,
       `a`.`total`,
       `c`.`s_name`
  FROM `shop_orders` a 
  INNER JOIN(SELECT * FROM `shop_config` WHERE `store_id`= 1) `c` ON `a`.`shop_id`= `c`.`id`
 ORDER BY `a`.`ctime` DESC
 LIMIT 0,30

我说一下我的排查过程。

1、先把ctime字段添加到索引。

2、加explain查询可知,因为我是join连表,当前语句没有索引。

因此我们加上强制索引force index(`ctime`)即可解决。

最终代码

SELECT `a`.`id`,
       `a`.`ctime`,
       `a`.`status`,
       `a`.`order_id`,
       `a`.`total`,
       `c`.`s_name`
  FROM `shop_orders` a force index(`ctime`)
  INNER JOIN(SELECT * FROM `shop_config` WHERE `store_id`= 1) `c` ON `a`.`shop_id`= `c`.`id`
 ORDER BY `a`.`ctime` DESC
 LIMIT 0,30

如果你需要做时间范围筛选,用时间戳大小的方式,不要使用FROM_UNIXTIME或者TO_DAYS( NOW( ) ),否则速度又回去了。知道是什么原因的老哥可在评论区指点一下。

'a.ctime >'.strtotime(date('Y-m-d',time()))

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值