我建了两个表,一个售后单表,一个售后商品明细表,都是五十个字段。

select *
FROM (select id, as_id, as_date, outer_as_id, so_id, type, created, modified, status, status_name, shop_status, shop_status_name, remark, question_type, warehouse, refund, payment, good_status, good_status_name, node, order_status, order_status_name, shop_type, shop_id, logistics_company, wh_id, confirm_date, freight, drp_co_id_from, receiver_mobile, receiver_name, shop_buyer_id, buyer_apply_refund, result, drp_co_id_to, items_id, labels, refund_version, ts, shop_name, shop_freight, currency, o_id, l_id, creator_name, refund_phase, orderlabels, batchs_id, wms_co_id, COALESCE(CAST(refund AS DECIMAL(10, 2)), 0) + COALESCE(CAST(freight AS DECIMAL(10, 2)), 0) - COALESCE(CAST(free_amount AS DECIMAL(10, 2)), 0) - COALESCE(CAST(payment AS DECIMAL(10, 2)), 0) AS refundable_amount
FROM zuodou_task_datas )a1
LEFT JOIN (select t2.id a2id,IFNULL(t1.r_qty,0) r_qty,IFNULL(t1.qty,0) qty,t2.i_id
FROM (select id c1id,IFNULL(sum(r_qty),0) r_qty,IFNULL(sum(qty),0) qty
FROM zuodou_task_item
WHERE type in ('退货','其他') GROUP BY id)t1
RIGHT JOIN (select id,GROUP_CONCAT(sku_id) AS i_id
FROM zuodou_task_item GROUP BY id)t2
ON t1.c1id=t2.id )a2
ON a1.items_id=a2.a2id ORDER BY created desc
LIMIT 10;

我秉承着能sql解决就用sql解决,但发现很慢就开启排查之路,我把数据导入到我本地,运行同样的sql很快一秒都不到,但阿里云服务器上面mysql运行就是不快,已经添加了唯一索引和普通索引,关联字段,查询条件字段,排序字段。

考虑是服务器(四核16g)不行,想这把4核全部给mysql 在my.conf中配置

innodb_read_io_threads=16#默认4

 innodb_write_io_threads=16#默认4,改为你的cpu逻辑数量

快了三十秒左右,很不错,以为是服务器原因了。

想想还有什么优化的地方

字段太多了?,删到了二十几个,快了十秒左右。

服务器配置看不懂,阿里云客服建议用云数据库,试用了,确实挺快。花钱就不香了

继续看sql,一条一条运行,发现是把分页放到了a1后面,快了,16秒

继续发现,查询datas表很快

select t2.id a2id,IFNULL(t1.r_qty,0) r_qty,IFNULL(t1.qty,0) qty,t2.i_id
FROM (select id c1id,IFNULL(sum(r_qty),0) r_qty,IFNULL(sum(qty),0) qty
FROM zuodou_task_item
WHERE type in ('退货','其他') GROUP BY id)t1
RIGHT JOIN (select id,GROUP_CONCAT(sku_id) AS i_id
FROM zuodou_task_item GROUP BY id)t2
ON t1.c1id=t2.id

就是这个sql很慢,我的需求是,退货/其他不同的id  的拿到qty和r_qty,还需要把同一id的商品编码GROUP_CONCAT(sku_id),按照逗号分割

一句点醒梦中人,我只要datas a1分页后的几条数据坐处理,想到一个解决办法,根据指定关联items_id  和id去查。一试用,快得很。

我就把以上sql段单独运行,加上 in  id() 完美解决查询慢的问题

总结:

对于这些关查询慢的问题尽量让他缩小区间,sql没什么问题的话加几个适合的索引,轻轻松松解决。

如果这些问题还不能就试试,代码,sql相结合。

最后还不行就考虑垂直分区,水平分区,读写分离,集群。

最最最后还不行,就可以买新服务器了(为公司省钱的员工,老板最爱)!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐