作者starjou (周星星)
看板PHP
标题Re: [请益] 关於大笔资料的统计
时间Fri Feb 29 15:22:18 2008
※ 引述《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
1F:推 okdla:我试着用left join 去查询查询的速度和子查询差不多.... 02/29 15:35
2F:→ okdla:加index上去速度是有比较快..但是还是大於一分钟..而且B表格 02/29 15:35
3F:→ okdla:目前不能够新增栏位(因为有别的原因),所以好像速度慢是正常 02/29 15:37
4F:→ okdla:的样子... 02/29 15:40
5F:→ starjou:第一个方法把 WHERE 改成 AND 呢? 02/29 16:32