本帖最后由 paullbm 于 2009-11-28 12:23:54 编辑

解决方案 »

  1.   

    为什么要用COUNT(*)?查询总数呢,用COUNT(ID),这样直接统计索引列就快啦嘛
    如果是100w的数据,建议你分块、分区保存,检索的时候根据用户权限分开即可
      

  2.   

    那查询条件呢?是 LIKE 查询,还是 = 查询?
      

  3.   


    同意。再使EXPLAIN查看下执行计划,瓶颈应该会更加清楚。
      

  4.   

    楼主的意思是,客户的需求,至少需要两步
    1.查总行数
    2.查n~n+x条数据。
    问有没有办法精简对吧?
    ---------------------
    我能想到的也仅仅是count(id),步骤方面我也想不到还有什么精简方法,我在项目中也是有这两步。
    同楼主问,关注。
      

  5.   

    关于数据库查询效率的优化有很多方式,也有很多途径!
    可能是你的查询语句的效率太低,特别是你使用Hibernate的时候!
    你也别说你用了默认索引,即使在这样的情况下也有可能导致索引失效,
    这些你都找点资料看吧,有些讲的也都很好!
      

  6.   

    优化SQL语句吧!或者iBATIS 也可以。
      

  7.   


    类似 select * from Users where name='abc' 这种查询效率也很低?
    我并没有使用模糊查询啊!!
    默认索引会失效?那如何能保证默认索引不失效呢?
      

  8.   

    项目做了一大半,再换iBATIS不太现实吧!!?
    而且iBATIS就算有优势,也应该各有利弊吧
      

  9.   


    COUNT(ID)确实比COUNT(*)效率高,但是一个项目中要进行分页的表不仅仅只是一个。如果以ID为统计数的话,那就意味通用分页还得对外要求一个主键字段的参数。个人认为每次查询的时候都需要count一次操作,始终不是个好方法。就算count的字段数只有一个的时候,它也是进行1KW次的行扫描!!
      

  10.   

    你的意思是在hibernate中配置查询缓存!
    目前而言,这个建议似乎具有一定的可行性
      

  11.   


    这是无法忽略的操作!!
    你现在只看1KW条记录的时候。1KW条记录总是一条一条增长上来的吧?
    难不成你还根据数目进行是否该忽略的条件判断?
    不仅是添加时不能忽略,而且删除操作也不能忽略!!
      

  12.   

    也遇到过类似楼主的问题。当时使用的是Oracle的数据库。做个是联通公司的项目。大数据量很头疼的问题啊。
      

  13.   

    真是服你了,這麼大的數據處理用Hibernate。處理大數據除了在SQL的使用上優化外,還要在數據庫的設計上優化。
    至於SQL上優化上面的已經說得差不多了,不再廢話了。
    設計上的優化,分區分表建索引。
    比如:我有1000W條記錄,就可以分為兩張表去存,每張500W記錄。數據的計總可以單獨放一張表裡,可以建觸發器(或用程式控制)去自動增加或減少。這樣的話無論有多少條數據,統計的時間就只有查詢一張小表的時間。
    唉,方法有很多種,好好想想,找尋一個適合的吧,祝你好運。
      

  14.   

    count(*)是数据库里面的函数吗,
      

  15.   

    你这取count的问题就和hibernate没有任何关系了 客户端根据查询条件如果取count的I/O和time都比较大的话 只能说明你索引建的不够好 好的索引只差count的话 应该很快。分页里面不要使用hibernate的什么fiest,last操作,具体里面怎么实现的没看过 没过过几次hibernate,完全可以使用数据库jdbc的分页方法操作应该要快的吧 比如mysql的limit oracle的with嵌套查询  sysbase和serversql的top 我感觉甚是不好用啊 
      

  16.   

    100W的数据 用户翻页翻到饿死也看不完哈 count字段最好能根据表结构进行分批次查询 比如一个月累加 或是 某个字段值的累加等。先取第一页 分页信息给他慢慢ajax取。
      

  17.   


    比如说搜索有按部门分类,按产品分类,按XX分类,按YY分类。当用户单独输入按部门分类或者按产品分类那没问题,一组合那怎么办。。每个排列都得统计数量
      

  18.   

    hibernate分页效率不太高的
    换JDBC算了 注意优化sql语句good luck
      

  19.   


    呵呵 减少访问次数,优化sql语句支持
      

  20.   

    一定要避免全表扫描。能不能强制加些查询条件,使索引可以用得上,like左匹配也是能用上索引的。
      

  21.   

    你还别说,如果数据量真大到一定程度的时候,使用SQL SERVER那肯定不行的撒。这也就是ORACLE在大数量级时候的优势嘛!!不过使用SQL SERVER的话,要分页,除了TOP没更好的方法了吧!!
      

  22.   

    没错JDBC是快了但Hibernate的优势又没了,这个是因噎废食嘛!!!
       优化Sql吧...
      
      

  23.   


    经本人测试:count(1)和count(*)效率是一样的!!!
      

  24.   

    我也认为如果数据量很大的话,每次翻页没必要去count一下。
      

  25.   

    翻页的时候忽略统计总数,必然导致你的count(数据)不准确,连起码的数据都不能保证准确,鬼才敢用你的程序
      

  26.   

    回答错误,本人经过测试,在oracle中,count(*)的效率比count(1)高!
    这个于常理不一样!
    还有就是,关于分页,我还是那个建议,既然用了Hibernante就用缓存,二级缓存!
      

  27.   

    可以分区查找数据  
      建议用PAGE 那个类