Re: [請益] 關於大筆資料的統計
※ 引述《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
02/29 15:35, 1F
→
02/29 15:35, , 2F
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
02/29 16:32, 5F
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章