9万条数据,用select*全部查询mysql数据库,数度超级慢,求解。

时间:2022-11-13 23:25:30
public List<Page> findAllPages() {
String hql = "from Page page order by page.id asc";
return (List<Page>) this.getHibernateTemplate().find(hql);
}
起初是调用这个方法,由于数据量太大,总是抛出内存不足的异常,后来改用分页处理的方法,但是越运行到后面,速度就越慢,差不多要10s才运行一条语句
  public List<Page> findPagesLimit(int x, int y) {
if (y == 0) {
return null;
}
Session session = this.getSession();
try {
String hql = "from Page page order by page.id asc";
Query q = session.createQuery(hql);
q.setFirstResult(x);
q.setMaxResults(y); 
  List l = q.list();
if (l.size() == 0) {
return null;
}
return (List<Page>) l;
} catch (RuntimeException re) {
throw re;
} finally {
session.close();
}

请大家指点下,怎么才能使得查询数度变快呢?

23 个解决方案

#1


强烈建议楼主采用分页。 想想都可怕一次性9万条数据。

难道楼主的主机是“银河处理器”

#2


直接运行SQL语句,是什么样的效果?
如果直接运行快的话,就不用hibernate了呗

#3


引用楼主 bearshadow 的回复:
public List<Page> findAllPages() {
String hql = "from Page page order by page.id asc";
return (List<Page>) this.getHibernateTemplate().find(hql);
}
起初是调用这个方法,由于数据量太大,总是抛出内存不足的异常,后来改用分页处理的方法,但是越运行到……


后面是采用 分页的方法呀,可是也很忙啊

#4


引用 2 楼 xinlingwuyu 的回复:
直接运行SQL语句,是什么样的效果?
如果直接运行快的话,就不用hibernate了呗


我的系统里面都是用hibernate来管理数据库的,又换成直接的,直接的是指用jdbc?这样不方便管理吧

#5


采用分页吧,先一次性查出前两百条数据,分为20页,当用户要再点击查看21页后面的数据时,要那一页的数据就去数据库查对应的数据。这是一种折中的策略、

#6


引用 5 楼 mrwangxiao0605 的回复:
采用分页吧,先一次性查出前两百条数据,分为20页,当用户要再点击查看21页后面的数据时,要那一页的数据就去数据库查对应的数据。这是一种折中的策略、


是采用分页的方法了,起初运行的很快,可是数据从10000条后获取1000就非常的慢了!困恼

#7


你电脑机子不行了吧? 我电脑几百万条数据查询都比你快啊

#8


lz用的什么db啊?
hibernate先试着用数据库的分页方法,如果没有则采用记录滚动的方法。

另外,你可以把数据库的分页语句 到sql的控制台上试试,我怀疑是表的外键什么的。

#9


才几万·~怎么可能这么慢哦~~~
Sql 语句的话 带上 limit 做限制 格式为  0,10; //从0开始取10条

#10


建一个索引啊

#11


1. 建索引字段。。。如你的id
2. 有可能你电脑配置太烂,自身硬件问题
3. 实在不行,就用jdbc进行sql分页,不用hibernate的分页,用mysql的limit

#12


from Page page order by page.id asc
这个HQL语句里你改成
select 你要的字段1,字段2,。。。,字段n from Page page order by page.id asc
试试。

#13


引用 7 楼 wusi19910719 的回复:
你电脑机子不行了吧? 我电脑几百万条数据查询都比你快啊

你用的是什么查询方法?

#14


第一最好采用有索引的关键字或者主键作为查询条件.

第二不知道楼住用的是什么分页方法,如果纯考虑性能的话最好采用物理分页,即采用定位串技术定位数据位置,每次查询直接取需要的那一页数据.如果是逻辑分页的话那系统也是将数据都读取到内存在进行分页的,那么你越往后查它读取的数据越多当然越来越慢了!

#15


9W条数据对数据库来说绝对是小意思,即使不适用索引也不会那么慢吧。应该问题还是出在你的逻辑上。

#16


企业级查询不建议使用*,我觉得12楼正解

#17


 用spring吗 我一般jdbcTemplate 和hibernateTemplate一起用的

#18


排除 机子 硬件问题    数据库没做优化   就是  数据库 除了存数据 没做其他的  优化处理   数据多了查询肯定慢    学学数据库 的查询优化    表的索引  建立视图   ......  不过 这是 数据库工程师  该干的事   当然 你也必须 知道 点 

#19


mysql 试试limit

#20


上银河cpu吧

#21


1.建索引
2.去掉select * 改成select 列名
3.分页

9W条数据 速度应该很快

#22


哥从来不用HQL,太烂了

#23


写sql吧,手动优化sql语句

#1


强烈建议楼主采用分页。 想想都可怕一次性9万条数据。

难道楼主的主机是“银河处理器”

#2


直接运行SQL语句,是什么样的效果?
如果直接运行快的话,就不用hibernate了呗

#3


引用楼主 bearshadow 的回复:
public List<Page> findAllPages() {
String hql = "from Page page order by page.id asc";
return (List<Page>) this.getHibernateTemplate().find(hql);
}
起初是调用这个方法,由于数据量太大,总是抛出内存不足的异常,后来改用分页处理的方法,但是越运行到……


后面是采用 分页的方法呀,可是也很忙啊

#4


引用 2 楼 xinlingwuyu 的回复:
直接运行SQL语句,是什么样的效果?
如果直接运行快的话,就不用hibernate了呗


我的系统里面都是用hibernate来管理数据库的,又换成直接的,直接的是指用jdbc?这样不方便管理吧

#5


采用分页吧,先一次性查出前两百条数据,分为20页,当用户要再点击查看21页后面的数据时,要那一页的数据就去数据库查对应的数据。这是一种折中的策略、

#6


引用 5 楼 mrwangxiao0605 的回复:
采用分页吧,先一次性查出前两百条数据,分为20页,当用户要再点击查看21页后面的数据时,要那一页的数据就去数据库查对应的数据。这是一种折中的策略、


是采用分页的方法了,起初运行的很快,可是数据从10000条后获取1000就非常的慢了!困恼

#7


你电脑机子不行了吧? 我电脑几百万条数据查询都比你快啊

#8


lz用的什么db啊?
hibernate先试着用数据库的分页方法,如果没有则采用记录滚动的方法。

另外,你可以把数据库的分页语句 到sql的控制台上试试,我怀疑是表的外键什么的。

#9


才几万·~怎么可能这么慢哦~~~
Sql 语句的话 带上 limit 做限制 格式为  0,10; //从0开始取10条

#10


建一个索引啊

#11


1. 建索引字段。。。如你的id
2. 有可能你电脑配置太烂,自身硬件问题
3. 实在不行,就用jdbc进行sql分页,不用hibernate的分页,用mysql的limit

#12


from Page page order by page.id asc
这个HQL语句里你改成
select 你要的字段1,字段2,。。。,字段n from Page page order by page.id asc
试试。

#13


引用 7 楼 wusi19910719 的回复:
你电脑机子不行了吧? 我电脑几百万条数据查询都比你快啊

你用的是什么查询方法?

#14


第一最好采用有索引的关键字或者主键作为查询条件.

第二不知道楼住用的是什么分页方法,如果纯考虑性能的话最好采用物理分页,即采用定位串技术定位数据位置,每次查询直接取需要的那一页数据.如果是逻辑分页的话那系统也是将数据都读取到内存在进行分页的,那么你越往后查它读取的数据越多当然越来越慢了!

#15


9W条数据对数据库来说绝对是小意思,即使不适用索引也不会那么慢吧。应该问题还是出在你的逻辑上。

#16


企业级查询不建议使用*,我觉得12楼正解

#17


 用spring吗 我一般jdbcTemplate 和hibernateTemplate一起用的

#18


排除 机子 硬件问题    数据库没做优化   就是  数据库 除了存数据 没做其他的  优化处理   数据多了查询肯定慢    学学数据库 的查询优化    表的索引  建立视图   ......  不过 这是 数据库工程师  该干的事   当然 你也必须 知道 点 

#19


mysql 试试limit

#20


上银河cpu吧

#21


1.建索引
2.去掉select * 改成select 列名
3.分页

9W条数据 速度应该很快

#22


哥从来不用HQL,太烂了

#23


写sql吧,手动优化sql语句