表InstallSW 结构如下:
userid productname version facturer insertdate flag
1 ati 1 aticpm 20090506 1
1 qq 12 tencent 20090507 1
1 qq 13 tencent 20090507 1
1 msn 10 microsoft 20090506 1
.
.
40000 ati 1 aticpm 20090506 1
40000 qq 12 tencent 20090507 1
40000 qq 13 tencent 20090507 1
40000 msn 10 microsoft 20090506 1数据量大概300万左右 ,在字段productname 和 version 上有联合索引。搜索sql:
SELECT A.productname,A.version
FROM InstallSW A
WHERE A.flag= 1 AND A.productname <> ''
GROUP BY A.productname, A.version 想搜索出所有的软件名及对应版本
实际搜索结果经过group by 以后 得到400多条记录 结果是正确的 但是执行时间用了50多秒 300万的数据量这样的搜索要求 ,用了50秒正常么?客户嫌慢 有什么办法改进么?
第二次点击链接就有缓存了 所以很快 ,关键是第一次很慢。
userid productname version facturer insertdate flag
1 ati 1 aticpm 20090506 1
1 qq 12 tencent 20090507 1
1 qq 13 tencent 20090507 1
1 msn 10 microsoft 20090506 1
.
.
40000 ati 1 aticpm 20090506 1
40000 qq 12 tencent 20090507 1
40000 qq 13 tencent 20090507 1
40000 msn 10 microsoft 20090506 1数据量大概300万左右 ,在字段productname 和 version 上有联合索引。搜索sql:
SELECT A.productname,A.version
FROM InstallSW A
WHERE A.flag= 1 AND A.productname <> ''
GROUP BY A.productname, A.version 想搜索出所有的软件名及对应版本
实际搜索结果经过group by 以后 得到400多条记录 结果是正确的 但是执行时间用了50多秒 300万的数据量这样的搜索要求 ,用了50秒正常么?客户嫌慢 有什么办法改进么?
第二次点击链接就有缓存了 所以很快 ,关键是第一次很慢。
FROM InstallSW A
WHERE A.flag= 1 AND ISNULL(A.productname,'') <> ''
GROUP BY A.productname, A.version
语句的话很好了,往其他方面考虑
flag+productname+version 建索引,应该会快些
硬件cpu是 Q6600 2.45 四核的 内存3G
加快速度应注意1,经常用来做联接的字段上面加索引
2,经常用来做条件的字段上面加索引
3,坚决避免在条件中使用否定意义的计算符呵呵,仅供参考,你sql已经不错了!
SELECT A.ProductName , A.MajorVersion, A.Manufacturer
FROM II_InstallSW A
WHERE A.OnCurrent = 1 AND B.Disabled = 0 AND A.ProductName <> ''
GROUP BY A.ProductName, A.MajorVersion, A.Manufacturer就是多搜了一个字段 , 多次删除sql缓存实验 速度还是很快 搜索内容的问题解决了
注(本sql 包括上面说的sql文 执行的时候都通过$db->SelectLimit 每次搜索15条)现在问题是获取分页时使用的$total值却很慢。
SELECT COUNT(*) as cnt
FROM II_InstallSW A
WHERE A.OnCurrent = 1 AND B.Disabled = 0 AND A.ProductName <> ''
GROUP BY A.ProductName, A.MajorVersion, A.Manufacturer$total = $rs->RecordCount();
现在没有主键。聚集索引好像是userid 和flag组合做的。
就是分页用的 group by 以后的记录条数 的获取很慢
我想是因为要进行全表扫描的原因么 怎么避免呢 用最快的方法获得groupby以后的count数
SELECT COUNT(*) as cnt
FROM InstallSW A
WHERE A.flag = 1 AND A.ProductName <> ''
GROUP BY A.ProductName, A.MajorVersion, A.Manufacturer
然后
$total = $rs->RecordCount();这样是不是因为要进行全表扫描?所以会慢?