天天看点

记录一次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秒以下,但是连表就出现几分钟的响应。

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

在几个老哥线上指导,均无法排排除问题,把订单列表页面都替换上了“暂时维护”的提示了。因为是阿里聚石塔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
           
记录一次mysql百万十万数据连表查询优化,300秒优化到0.2秒,速度提升千倍!

起初以为结束了,但是又一个老哥提醒到我,这样我就无法给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
           
记录一次mysql百万十万数据连表查询优化,300秒优化到0.2秒,速度提升千倍!

正式结束。

你好,我是勤勤学长。

www.11ak.cn

QQ微信同号318692996