作者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