记录一次mysql百万十万数据连表查询优化,300秒优化到0.2秒,速度提升千倍!

今天打开网站的订单列表页面,加载超久,最后还502了,数据库跑满无法使用导致第三方平台推送失败。

订单有接近17万条,网站用户400,改sql加载200~300秒

SELECT `a`.`shop_id`,
        `a`.`ctime`,
        `a`.`status`,
        `a`.`order_id`,
        `a`.`total`,
        `w`.`s_name`,
        `a`.`result`,
        `w`.`shop_type`,
        `a`.`originalPrice`
FROM `shop_orders` `a`
INNER JOIN `shop_config` `w`
    ON `w`.`id`=`a`.`shop_id`
WHERE ( w.store_id=1 )
        AND ( w.delete_time =0 )
ORDER BY  `a`.`ctime` DESC LIMIT 0,30

经测试,单表提取数据也是1秒以下,但是连表就出现几分钟的响应。

在几个老哥线上指导,均无法排排除问题,把订单列表页面都替换上了“暂时维护”的提示了。因为是阿里聚石塔RDS,也无法导出这十几万数据库到本地测试。

当然也不排除是数据库配置太低,毕竟1g1核。计划临时升级数据库配置看,为了保证不影响网站的使用,可以设置为在指定时间替换,在掏钱的时候,还是想再搜搜相关资料。

看到一篇文章,说可以把连表查询改为子查询。

SELECT shop_id,
       ctime,
       a.status,
       order_id,
       total,
       (select s_name from shop_config where id= a.shop_id) as s_name,
       (select shop_type from shop_config where id= a.shop_id) as shop_type,
       result,
       originalPrice
  FROM `shop_orders` `a`
 ORDER BY `ctime` DESC
 LIMIT 0,30

起初以为结束了,但是又一个老哥提醒到我,这样我就无法给shop_config 加条件限制了。此时我又想到了,还是用连表查询,join是可以使用子查询的。

SELECT `a`.`shop_id`,
       `a`.`ctime`,
       `a`.`status`,
       `a`.`order_id`,
       `a`.`total`,
       `c`.`s_name`,
       `c`.`shop_type`,
       `c`.`store_id`,
       `result`,
       `originalPrice`
  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

 

正式结束。

你好,我是勤勤学长。

www.11ak.cn

QQ微信同号318692996

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值