日期:2014-05-17  浏览次数:20687 次

采用Hibernate的项目中,频繁使用“select count(*) from Item where id=xx”语句,如何提高查询速度?
完全hibernate小白,第一次使用,频繁使用“select count(*) from Item where id=xx”语句,但效率很低。

我的业务需要我统计当前符合条件的条目的数量。我方法如下

query= session.createQuery(“select count(*) from Item where id=xx”) ;

int sum=Integer.parseInt(query.list().get(0).toString());

效率好低,我觉得好像方法转来转去的也不科学,感觉好蠢呐,哪位大大有比较高效一点的方法吗?

------解决方案--------------------
如果你的条件是用主键来完成的,那可以使用二级缓存,或者你可以参考hibernate上面所介绍的方法.
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue(),这样就不用返回整个集合,
------解决方案--------------------
sql本身没法在优化了吧  可以从数据库层面去优化  你如加索引 分区表等
------解决方案--------------------
我给你优化点吧...

select count(id) from Item where id=xx

id 最好能是主键,不是的话看情况加索引。
------解决方案--------------------
引用:
就像楼上说的一样,你做一个id的视图,然后后面直接调用视图的话,可以快很多,如果你的字段有上百个的话,那就快了百倍了


视图不是预编译的sql。。view在查询的时候,还是会执行一遍里面的select语句
create view v_test select count(1) from ...
效率没有提高,只是操作起来方便了。

况且这里的查询sql还需要传递一个参数,需要返回一个值,用的话也是用function了。。
------解决方案--------------------
数据库优化就那么几点
1、使用索引,频繁查询字段需要建立索引,而且字段数据没有包含NULL。
2、查询语句不存在变动,这样数据库就不会重复解析sql来影响查询速度:
例如select * from table t where id=xx;与select * from table t where id=?; xxx.setInt(xx);
第一个xx这个值不断变动,影响语句变动,sql对每个不同的值都要完成语句编译,造成查询速度下降,后一种的?不会变动,值由api注入进去,因此语句不会变动,sql调用不会重复编译语句。
3、不要使用跑背离索引的查询,例如not查询 包含null的查询 like '%xxx%'这样的查询,同样尽量也不要使用函数。
4、查询尽量不要使用抽取所有值的查询,尽量有where字句来使用索引。
5、in语句中不要包含子查询,如果需要使用exists子查询。
6、查询尽量使用简单值,不要使用复杂数值或者函数。例如select count(1)from table就会比select count(*) from table快一点。
------解决方案--------------------
返回一条就用uniqueResult()