[請益] PHP迴圈+Mysql搜尋優化問題

看板PHP作者 (桑原)時間10年前 (2013/12/23 17:18), 編輯推噓0(0011)
留言11則, 4人參與, 最新討論串1/5 (看更多)
大家好, 狀況類似是這樣 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

12/23 17:35, , 1F
我覺得您可以嘗試 explain 看看 SQL有沒有辦法跑出來
12/23 17:35, 1F

12/23 17:35, , 2F
因為這種 show出 data的東西 很多時候是慢在 產生html
12/23 17:35, 2F

12/23 17:36, , 3F
百萬比對於mysql應該還好 千萬就真的 有危險了
12/23 17:36, 3F

12/23 17:48, , 4F
當然可以,寫看看不會爆炸.對SQL就是自動加temp col而已
12/23 17:48, 4F

12/23 19:57, , 5F
我有一個很無聊的想法, 先把 shop, id 各用一個子查詢做
12/23 19:57, 5F

12/23 19:58, , 6F
group by , 再拋來給外面的查詢用... 呃,真的很怪,算了QQ
12/23 19:58, 6F

12/23 21:10, , 7F
先下index
12/23 21:10, 7F

12/23 21:13, , 8F
你的資料庫好可憐,被你連線這麼多次
12/23 21:13, 8F

12/23 21:14, , 9F
為何不Where id IN ('Exx1', 'Exx2')
12/23 21:14, 9F

12/23 21:15, , 10F
程式少跑幾萬次迴圈,資料庫你該欄位有設Index會快些
12/23 21:15, 10F

12/23 21:15, , 11F
最後一樣把子select sum起來就好
12/23 21:15, 11F
文章代碼(AID): #1Ij__qGI (PHP)
討論串 (同標題文章)
文章代碼(AID): #1Ij__qGI (PHP)