Re: [請益] 關於大筆資料的統計

看板PHP作者 (周星星)時間18年前 (2008/02/29 15:22), 編輯推噓1(104)
留言5則, 2人參與, 最新討論串2/4 (看更多)
※ 引述《okdla (跟著鄉民進來看熱鬧)》之銘言: : 請問一下,用php連mssql : 如果mssql裡的資料有快5萬筆 : 統計起來很慢是不是算正常的呢??? : 比如說我mssql裡有A資料表儲存學生的姓名和基本資料,然後B資料表儲存學生學科的 : 成績 : 我要統計學生成績在0-50,50-60,60-70,70-80,80-90,90-100的個數和學生性別的關係.. : 我用php的mssql_query去跑,可是要跑快2分鐘,這是正常的嗎?? : 還是說php無法處理太多筆數的資料表呢?? : 我是這樣下指令的 : select count(*) from A where A.sex='F' and A.fid in (select fid from B where : B.grade>=0 and B.grade<50) : select count(*) from A where A.sex='M' and A.fid in (select fid from B where : B.grade>=0 and B.grade<50) : . : . : . : . : fid是學生編號為唯一值,sex是性別,grade是成績 : 大概是要做出一個如下的統計表 : 0-50 50-60 60-70 70-80 80-90 90-100 : ------------------------------------ : 男筆數 : 女筆數 : 是我指令下錯了嗎???還是php跑的本來就很慢呢??? : 建view的話速度可以變快嗎???要如何建呢?? SELECT count(*) FROM A LEFT JOIN B ON A.fid = B.fid WHERE A.sex='F' AND B.grade >=0 AND B.grade <=50 A.fid 跟 B.fid 要設 index 試試看這樣速度是不是有改善。 A.sex 跟 B.grade 也可以加上 index 看看速度的差別, 不過如果 B 的資料增刪頻繁,把 grade 加上 index 會影響以後 INSERT 的速度 另外也可以在 B 上面加一個欄位,假設叫 level,0-50 設成 1, 51-60 設成 2 ..... 之後只要 SELECT B.level, A.sex, count(*) FROM A LEFT JOIN B ON A.fid = B.fid GROUP BY B.level, A.dex 可以只用一個 sql 敘述得到所要的統計。不過在每個 INSERT B 的時候要去維護 level 這個欄位的資料,而且失去彈性,(範圍定死了) 效能的話我也不知道會有什麼樣的影響,要測測看 ..... 試了有結果要 PO 上來哦 :p -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.81.197.185

02/29 15:35, , 1F
我試著用left join 去查詢查詢的速度和子查詢差不多....
02/29 15:35, 1F

02/29 15:35, , 2F
加index上去速度是有比較快..但是還是大於一分鐘..而且B表格
02/29 15:35, 2F

02/29 15:37, , 3F
目前不能夠新增欄位(因為有別的原因),所以好像速度慢是正常
02/29 15:37, 3F

02/29 15:40, , 4F
的樣子...
02/29 15:40, 4F

02/29 16:32, , 5F
第一個方法把 WHERE 改成 AND 呢?
02/29 16:32, 5F
文章代碼(AID): #17nxAi_8 (PHP)
文章代碼(AID): #17nxAi_8 (PHP)