作者anawak (...)
看板PHP
标题Re: [请益] PHP回圈+Mysql搜寻优化问题
时间Fri Jan 3 13:31:28 2014
※ 引述《kingoface (桑原)》之铭言:
: 大家好,
: 状况类似是这样
: Table
: shop id price
: s001 EXA001 500
: A0002 EXB002 400
: s001 EXC001 300
: g0012 EXD003 350
: b002 EXA001 500
: b002 EXA001 500
: shop会有不同的编码,没有规则,字元不固定.
: id是有规则的编码,只有前三码是数字,并且固定就6个字元
: 资料库约有几百万笔类似资料
: 而我想要知道id分别为EXA,EXB,EXC在各分店的总销售价格.
: 所以先做了两个阵列
: 比如
既然全部都会用到,那不用判断,直接全捞出来
$sql = "SELECT * FROM table";
$result = mysql_query ($sql)
while($row = mysql_fetch_assoc($result)){
$shop = $row['shop'];
$short_id = substr($row['id'],0,3);
$new_arr[$short_id][$shop] += $row['price'];
}
//你的资料表栏位应该不只这些,选择必要的栏位就好。
$new_arr 就是你要的。这样应该可以吧。程式码简短有力。
但是效率我就不知道了。
: $id_arr=array('EXA001','EXB002'~~~~~~~~~~巴拉巴拉);
: $shop_arr=array('s001','A0002'~~~~巴拉巴拉);
: 然後
: foreach($id_arr as $id_for)
: {
: foreach($shop_arr as $shop_for)
: {
: //以下开始叫出资料并且存成二为阵列,类似这样
: $sql="SELECT SUM(num1) as sumprice FROM (SELECT price as num1 FROM table WHERE id LIKE '{$id_for}%' AND shop LIKE '{$shop_for}%') as num2 ";
: $sumprice = mysql_fetch_object($sql);
: $ans_arr[$id_for][$shop_for]=$sumprice->price;
: }
: }
不负责任随便分析一下,
你原本两个回圈,几百万笔 * 几百万笔,那大概做了n亿次的运算吧。
而且每一次的查询里面还有子查询 @@
我的方法只查一次,没有子查询,php回圈只有一次。
应该会快很多。
: 最後资料出来是出来了,但是跑了大概30多秒吧...超久.
: 我知道以上是很蠢的做法,囧兴.
: 所以想要请教各位先进,有没有更高级快速的做法呢?
: 我的想法是
: shop基本上应该还是用回圈去跑,但是id可以判断前三码,只截取前三码,
: 然後把他们GROUP BY,这样可行吗?
: 类似
: GROUP BY SUBSTR(id,0,2);
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: anawak 来自: 61.231.92.60 (01/05 22:12)