作者kingoface (桑原)
看板PHP
标题[请益] Mysql搜寻优化问题
时间Mon Dec 23 17:18:40 2013
大家好,
状况类似是这样
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在各分店的总销售价格.
所以先做了两个阵列
比如
$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;
}
}
最後资料出来是出来了,但是跑了大概30多秒吧...超久.
我知道以上是很蠢的做法,囧兴.
所以想要请教各位先进,有没有更高级快速的做法呢?
我的想法是
shop基本上应该还是用回圈去跑,但是id可以判断前三码,只截取前三码,
然後把他们GROUP BY,这样可行吗?
类似
GROUP BY SUBSTR(id,0,2);
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.124.195.130
1F:→ kosjason:我觉得您可以尝试 explain 看看 SQL有没有办法跑出来 12/23 17:35
2F:→ kosjason:因为这种 show出 data的东西 很多时候是慢在 产生html 12/23 17:35
3F:→ kosjason:百万比对於mysql应该还好 千万就真的 有危险了 12/23 17:36
4F:→ MOONRAKER:当然可以,写看看不会爆炸.对SQL就是自动加temp col而已 12/23 17:48
5F:→ gname:我有一个很无聊的想法, 先把 shop, id 各用一个子查询做 12/23 19:57
6F:→ gname:group by , 再抛来给外面的查询用... 呃,真的很怪,算了QQ 12/23 19:58
7F:→ dlikeayu:先下index 12/23 21:10
8F:→ dlikeayu:你的资料库好可怜,被你连线这麽多次 12/23 21:13
9F:→ dlikeayu:为何不Where id IN ('Exx1', 'Exx2') 12/23 21:14
10F:→ dlikeayu:程式少跑几万次回圈,资料库你该栏位有设Index会快些 12/23 21:15
11F:→ dlikeayu:最後一样把子select sum起来就好 12/23 21:15