表A有1万条数据,表B有1千万条数据
需要对表A的每条数据与表B进行模糊或者精确查询,单条数据查询的效果还是可以的,但是表A有1万条数据,总的时间就慢了,有什么方法能提高总的查询速度吗?优化到5秒以内,或者说有什么其它办法能达到类似的效果?表A最大数据量20万,表B是4千万。
需要返回的数据格式
表A数据1:
结果1:
结果2:
......
的格式
表A数据2:
结果1:
结果2:
的格式
用Java的线程池去并发获取查询结果,你的a表数据很多,对两个表链接的字段进行索引设计
不能对ROWNUM使用>(大于1的数值)、>=(大于或等于1的数值)、=(大于或等于1的数值),否则无结果
– 所以直接用只能从1开始
– rownum >10 没有记录,因为第一条不满足去掉的话,第二条的rownum又成了1,所以永远没有满足条件的记录。
select * from student where rownum>=1;
–如果想要用rownum不从1开始,需按下面方法使用
select a1.* from (select student.*,rownum rn from student) a1 where rn >5;
–分页查询一
select * from (select a1.,rownum rn from (select * from student) a1 where rownum <=5) where rn>=2;
–分页查询二
select a1. from (select student.,rownum rn from student where rownum <=5) a1 where rn >=3;
–分页查询三
select a1. from (select student.*,rownum rn from student) a1 where rn between 3 and 5;
针对查询速度慢的问题,可以考虑以下几种优化方法:
1.优化SQL查询语句 通过优化查询语句可以减少不必要的查询次数,例如:
2.使用PreparedStatement代替Statement PreparedStatement是在执行前编译的,可以提高执行速度,预编译的代码可缓存,也能够防止sql注入。
3.使用连接池 每次会话后关闭连接,会造成频繁创建和关闭连接的消耗,使用连接池可以减少连接创建和销毁的次数。
4.增大内存缓存大小 内存缓存大小是影响数据库性能的一个重要因素,可以适当增加内存缓存大小以减少磁盘I/O次数。
5.避免占用表锁 表锁是针对整张表的,当一行被锁定时,其它行无法访问,占用表锁可能会导致性能急剧下降,应该尽量避免占用表锁。
6.使用查询缓存 查询缓存可以缓存查询结果,当再次查询相同的结果时不需要再次访问数据库,直接从缓存中获取,提高查询性能。
实践中,需要根据实际情况综合考虑并采用一些或全部优化方法,减少不必要的数据库I/O,提高数据库查询性能。