表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秒正常么?客户嫌慢 有什么办法改进么?
第二次点击链接就有缓存了 所以很快 ,关键是第一次很慢。

解决方案 »

  1.   

    SELECT A.productname,A.version  
    FROM InstallSW A 
    WHERE A.flag= 1  AND ISNULL(A.productname,'') <> '' 
    GROUP BY A.productname, A.version 
    语句的话很好了,往其他方面考虑
      

  2.   

    如果 flag=1 的记录数不多的话,可按
    flag+productname+version 建索引,应该会快些
      

  3.   

    flag=1 的数据很多 基本上是90%以上的
    硬件cpu是 Q6600 2.45    四核的  内存3G  
      

  4.   

    <>  用  <  、  >  代替,>用>=代替,<用<=代替,这样可以有效的利用索引 在查询时尽量减少对多余数据的读取包括多余的列与多余的行
    加快速度应注意1,经常用来做联接的字段上面加索引
    2,经常用来做条件的字段上面加索引
    3,坚决避免在条件中使用否定意义的计算符呵呵,仅供参考,你sql已经不错了!
      

  5.   

    呵呵 奇怪的现象发生  使用下面的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();
      

  6.   

    还是索引的问题。为什么在字段productname 和 version  上做联合索引?那表的聚集索引是哪个字段?建议去看下给字段建索引的法则。通常新建的表,默认聚集索引是ID列(自增长,主键)。这是肯定要改的,我建议把flag做为聚集索引。然后再根据实际的查询情况建其它索引/组合索引。
      

  7.   

    在字段productname 和 version  上建联合索引 因为有搜索 会以他俩个为条件
    现在没有主键。聚集索引好像是userid 和flag组合做的。
      

  8.   

    现在搜索需要显示的前15条记录 速度很快 1秒左右 
    就是分页用的 group by 以后的记录条数 的获取很慢
    我想是因为要进行全表扫描的原因么 怎么避免呢 用最快的方法获得groupby以后的count数
      

  9.   

    现在残留的问题就是  搜索 分页时候用的 软件总记录数很慢
    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();这样是不是因为要进行全表扫描?所以会慢?