如何在千万级数据库里一次查询上万条数据?

时间:2021-02-25 23:28:11
需要解决的最终问题:查询速度慢.


需求介绍:
1:别人访问我模块,我提供查询条件供用户查询(查询条件:性别,年龄,毕业学校等),然后我把符合条件的信息在网页中展示出来。并且我要把查询出来的姓名( 这里暂定为姓名,查询出来的姓名不允许重复[b]返回给调用我的模块(返回一个文件地址,然后调用者去取这些数据),[/b]查询条数分为(5000,10000,15000)。

2:查询出来的数据要求乱序,没有规则(如:查询出来的ID(该列必须展示出来)为 1 2 3 4 5  或 5 4 3 2 1 哪么在网页里展示出来的ID要求不能有顺序。展示效果 3 5 1 4 2 反正就是顺序打乱)。

3:相同条件查询出来的数据要求每次都不能完全一样。
如:符合年龄的数据有 aa bb cc dd ee ff gg 。 每次用相同条件查询出来的信息都要求不能完全一样
第一次查询出来的信息是: bb dd ff
第二次查询出来的信息是: bb aa ee 或 dd bb gg 反正就是条件相同,展示的信息及返回的信息要求有区别。

4:如果符合条件的数据没有这么多,就拿公用信息来弥补.( 这里的意思是,如何符合条件的信息不足时,我需要查询二次

5:查询出来后通过我网页上的一个确定按钮把查询的信息返回给调用模块。


环境介绍:数据库 sqlserver 2000 java 程序没有放在有数据库的电脑上,在同一个局域网内。
1: 现在数据库的表里有2000万左右的数据,并且以后还会向表里增加数据,另外该表的数据一般不会有变化,只在每天晚上会发生一次变化。
2:  查询条件和排序的列都有索引。


执行的sql语句如下:
int queryIndex = 5000;//这里有可能是10000和15000(根据用户选择的查询条数而定)
select top queryIndex 列1,列2...(约7列) from table where 条件 = ?order by 列3   


该数据在查询分析器里执行速度最慢15秒左右。正常都是在3秒左右。(以5000为列)
查询条件没有 in 没有like 没有between 基本都是 条件>='20' 或 条件 != '北京大学' 查询的条件个数通过选择查询的条件而定,一般有1个到6个.

目前遇到的问题:
1:由于需求一次要求取5000条数据,而且还要把这些信息在网页中展示出来,通过分页展示5000条,为什么一次取5000请参见需求1红字部分。
2:这个业务逻辑我想不出其它办法实现了,我只有一次查询5000条,而且这5000条还有可能查询两次(因为第一次查询出来的数据没这么多)。
   
关于这两个问题,请问大家如何看待,如何解决

3:关于目前的需求,大家有什么好的思路.
4:[b] 需要解决的最终问题:查询速度慢.[/b].

如果还有什么不明白,请大家全部提出来。
jdbc和hibernate我都试过。最终选择用hibernate进行查询
java程序代码:
http://topic.csdn.net/u/20110302/12/d79dbea6-37af-4c2a-8e29-93b30fb0fd21.html
 
我最近发现一个奇怪的问题:
看了我贴,并且回贴的,不久事业有成了,恋爱成功了,彩票中奖了,心情舒畅了,生活幸福了,家庭美满了。

kanTieBuHui banShengBuSui.

7 个解决方案

#1


你这需求说的乱七八糟的,东一句,西一句

实在没明白你的真正意思

千万级数据不算多,一次返回给客户端5000条数据,做分页的话,就没必要了


目前遇到的问题:
1:由于需求一次要求取5000条数据,而且还要把这些信息在网页中展示出来,通过分页展示5000条,为什么一次取5000请参见需求1红字部分。


没看你需求1有红字的部分。
既然分页,就没必要一次取5000




2:这个业务逻辑我想不出其它办法实现了,我只有一次查询5000条,而且这5000条还有可能查询两次(因为第一次查询出来的数据没这么多)。

没看明白。


另,别人看帖想回就回,你这态度和口德,估计没多少人愿意帮你

#2


runer  
真正意思 解决查询速度慢

既然分页,就没必要一次取5000 分页的5000条数据是查询出来后写入一个文件的,最终通过这个文件分页。
如果不这样做,哪么别人一进来点击查询,然后点确定返回,哪么我无法返回给他5000条数据。
 
你的第二个不明白,就是该业务如果不一次查询5000条出来,这个业务我就实现不了。

还有你说态度和口德的问题。我只是开个小小的玩笑,没别的意思,如果认为这样不好,我收回我的话,好吧!

#3


那这个问题实际上是数据库的优化问题了

简单的一个查询和分页,不会有太多效率上的问题

如果在查询分析器里执行都需要10多秒,在硬件没有太多瓶颈的前提下,

那你这个数据库的数据结构可能会有些不太合理

而且像你所说,也米有复杂的关联查询之类的

还是看看数据库吧,索引,分区之类的

或者你实现这个需求的思路就有点偏差。。

但你没有更详细的信息,也没法作出准确判断

#4


你没有更详细的信息,也没法作出准确判断
runer 请问,你还需要哪方面的详细信息。
简单的一个查询和分页,不会有太多效率上的问题

关键是不能分页从数据库里查询。
别人要从我这里取5000条数据,是把查询出来的信息我写入文件,别人从文件里取。所以我无法分页查询。

就算是写入文件的数据分页查询出来后写进去,但页面显示还是会等很久。。

#5


order by 列3

为了提高查询速度,列3上还是要做索引的。

保持查询出来的数据乱序(多奇怪的需求),就只能在Java程序侧自己做了。

#6


那这个问题实际上是数据库的优化问题了

简单的一个查询和分页,不会有太多效率上的问题

如果在查询分析器里执行都需要10多秒,在硬件没有太多瓶颈的前提下,

那你这个数据库的数据结构可能会有些不太合理

而且像你所说,也米有复杂的关联查询之类的

还是看看数据库吧,索引,分区之类的

或者你实现这个需求的思路就有点偏差。。

但你没有更详细的信息,也没法作出准确判断

#7


magong
索引还是有的。。排序列和条件列全有索引。,。

#1


你这需求说的乱七八糟的,东一句,西一句

实在没明白你的真正意思

千万级数据不算多,一次返回给客户端5000条数据,做分页的话,就没必要了


目前遇到的问题:
1:由于需求一次要求取5000条数据,而且还要把这些信息在网页中展示出来,通过分页展示5000条,为什么一次取5000请参见需求1红字部分。


没看你需求1有红字的部分。
既然分页,就没必要一次取5000




2:这个业务逻辑我想不出其它办法实现了,我只有一次查询5000条,而且这5000条还有可能查询两次(因为第一次查询出来的数据没这么多)。

没看明白。


另,别人看帖想回就回,你这态度和口德,估计没多少人愿意帮你

#2


runer  
真正意思 解决查询速度慢

既然分页,就没必要一次取5000 分页的5000条数据是查询出来后写入一个文件的,最终通过这个文件分页。
如果不这样做,哪么别人一进来点击查询,然后点确定返回,哪么我无法返回给他5000条数据。
 
你的第二个不明白,就是该业务如果不一次查询5000条出来,这个业务我就实现不了。

还有你说态度和口德的问题。我只是开个小小的玩笑,没别的意思,如果认为这样不好,我收回我的话,好吧!

#3


那这个问题实际上是数据库的优化问题了

简单的一个查询和分页,不会有太多效率上的问题

如果在查询分析器里执行都需要10多秒,在硬件没有太多瓶颈的前提下,

那你这个数据库的数据结构可能会有些不太合理

而且像你所说,也米有复杂的关联查询之类的

还是看看数据库吧,索引,分区之类的

或者你实现这个需求的思路就有点偏差。。

但你没有更详细的信息,也没法作出准确判断

#4


你没有更详细的信息,也没法作出准确判断
runer 请问,你还需要哪方面的详细信息。
简单的一个查询和分页,不会有太多效率上的问题

关键是不能分页从数据库里查询。
别人要从我这里取5000条数据,是把查询出来的信息我写入文件,别人从文件里取。所以我无法分页查询。

就算是写入文件的数据分页查询出来后写进去,但页面显示还是会等很久。。

#5


order by 列3

为了提高查询速度,列3上还是要做索引的。

保持查询出来的数据乱序(多奇怪的需求),就只能在Java程序侧自己做了。

#6


那这个问题实际上是数据库的优化问题了

简单的一个查询和分页,不会有太多效率上的问题

如果在查询分析器里执行都需要10多秒,在硬件没有太多瓶颈的前提下,

那你这个数据库的数据结构可能会有些不太合理

而且像你所说,也米有复杂的关联查询之类的

还是看看数据库吧,索引,分区之类的

或者你实现这个需求的思路就有点偏差。。

但你没有更详细的信息,也没法作出准确判断

#7


magong
索引还是有的。。排序列和条件列全有索引。,。