統計推薦人總數、下單金額的sql優化

表結構:sql

 
CREATE TABLE `p_account_log` (
  ` log_id` mediumint(8unsigned NOT NULL AUTO_INCREMENT,
  ` uid` mediumint(8unsigned NOT NULL COMMENT '號',
  ` use_money` decimal(10,2NOT NULL DEFAULT '0.00' COMMENT '金',
  ` change_time` int(10unsigned NOT NULL COMMENT '間',
  ` change_desc` varchar(255NOT NULL DEFAULT '' COMMENT '注',
  ` change_type` tinyint(3unsigned NOT NULL COMMENT '型0,1費, 2員 3勵 99他',
   PRIMARY KEY (`log_id`),
   KEY `user_id` (`uid`)
ENGINE=InnoDB AUTO_INCREMENT=82416 DEFAULT CHARSET=utf8 COMMENT='表';
CREATE TABLE `p_order` (
  ` order_id` int(10unsigned NOT NULL AUTO_INCREMENT,
  ` uid` int(11DEFAULT '0' COMMENT '號',
  ` username` varchar(30DEFAULT '' COMMENT '名',
  ` courier_id` int(11DEFAULT '0' COMMENT '遞ID',
  ` courier_name` varchar(180DEFAULT '' COMMENT '稱',
  ` sum_money` decimal(10,2DEFAULT '0.00' COMMENT '額',
  ` order_status` tinyint(1DEFAULT '0' COMMENT '態',
  ` pay_status` tinyint(1DEFAULT '0' COMMENT '態',
  ` add_time` int(10DEFAULT '0' COMMENT '間',
  ` pay_time` int(10DEFAULT '0' COMMENT '間',
  ` sender_name` varchar(30DEFAULT '' COMMENT '名',
  ` sender_province` varchar(30DEFAULT '' COMMENT '份',
  ` sender_city` varchar(30DEFAULT NULL COMMENT '市',
  ` sender_district` varchar(30DEFAULT '' COMMENT '區',
  ` sender_address` varchar(180DEFAULT '' COMMENT '址',
  ` sender_zip` varchar(10DEFAULT '' COMMENT '碼',
  ` sender_mobile` varchar(20DEFAULT '' COMMENT '機',
  ` sender_telphone` varchar(20DEFAULT '' COMMENT '機',
   PRIMARY KEY (`order_id`)
ENGINE=InnoDB AUTO_INCREMENT=63284 DEFAULT CHARSET=utf8 COMMENT='表';
CREATE TABLE `p_user` (
  ` uid` int(10unsigned NOT NULL AUTO_INCREMENT,
  ` username` varchar(30DEFAULT '' COMMENT '名',
  ` password` varchar(32DEFAULT '' COMMENT '碼',
  ` mobile` varchar(20DEFAULT '' COMMENT '號',
  ` qq` varchar(20DEFAULT '' COMMENT 'QQ',
  ` email` varchar(160DEFAULT '' COMMENT '件',
  ` amount` decimal(10,2DEFAULT '0.00' COMMENT '額',
  ` agent_id` int(11DEFAULT '0' COMMENT '級ID',
  ` start_time` int(10DEFAULT '0' COMMENT '期',
  ` wenti` tinyint(2DEFAULT '0' COMMENT '題',
  ` daan` varchar(100DEFAULT '' COMMENT '案',
  ` referrer_uid` int(11DEFAULT '0' COMMENT '人',
  ` status` tinyint(1DEFAULT '1' COMMENT '0用 1用',
  ` add_time` int(10DEFAULT '0' COMMENT '期',
   PRIMARY KEY (`uid`)
ENGINE=InnoDB AUTO_INCREMENT=4502 DEFAULT CHARSET=utf8 COMMENT='表';


數據量不是很大,會員4500,82000,訂單63000
結果:統計推薦人推薦會員總數、提成金額、推薦會員下單總金額。這裏會員總數和提成金額是根據會員等級再變更,因此沒法用固定比例。
第一次寫的sql語句以下:
ui

 
SELECT t2.referrer_uid,t1.username,t2.count,
(SELECT sum(use_moneyfrom p_account_log where change_type=and p_account_log.uid=t1.uidas use_money,
(SELECT sum(sum_moneyfrom p_order where uid in (select uid from p_user where referrer_uid=t1.uid)) as sum_money
from p_user t1 
INNER JOIN (select referrer_uid,count(*as count from p_user where referrer_uid>GROUP BY referrer_uidt2
on t1.uid=t2.referrer_uid
ORDER BY use_money desc
 

執行時間9.6S,毫無疑問那個雙層子查詢拖慢了速度,改變一下:
spa

 
SELECT t2.referrer_uid,t1.username,t2.count,
(SELECT sum(use_moneyfrom p_account_log where change_type=and p_account_log.uid=t1.uidas use_money,
SUM(t3.sum_moneyas sum_money
from p_user t1 
INNER JOIN (select referrer_uid,count(*as count from p_user where referrer_uid>GROUP BY referrer_uidt2
on t1.uid=t2.referrer_uid
INNER JOIN 
(SELECT m1.uid,m2.referrer_uid,m2.username,sum(sum_moneyas sum_money from p_order m1
INNER JOIN p_user m2 on m1.uid=m2.uid and m2.referrer_uid>0
GROUP BY m1.uid,m2.referrer_uidt3 
on t3.referrer_uid=t2.referrer_uid
group by t2.referrer_uid
ORDER BY use_money desc
 

執行時間0.2S,啊哦,原本還想着把提成金額也分解出來,看狀況不用了。
結論:子查詢儘可能別濫用!
ip

相關文章
相關標籤/搜索