关于数据库水平切分中分页查询问题的解决方案

数据库 SQL Server
本文我们主要介绍了数据库水平切分中分页查询的问题的解决方案,希望本次的介绍能够对您有所帮助。

数据库水平切分中分页查询的问题是本文要介绍的主要内容。接下来我们通过一个例子来说明:昨天淘宝的同事问了我一个技术培训上讲师问的问题:我们对数据库关于商品的表放在了2个库,分别是A库和B库 ,每个库1张表,然后将id为奇数的放到A库中,id为偶数的放到B库中,现在需要查询价格在100-200之间的商品,并根据销量来排序,请给出具体的查询方案,然后总结这个方案有什么缺点。

1.保证查询结果正确性的方式:

比如查询第1-20条记录的时候,就得在A库中执行

 

  1. select*  
  2.  
  3. fromxxx  
  4.  
  5. wherexxx.price>=100and  
  6.  
  7. xxx.price<=200  
  8.  
  9. orderbyxxx.sales_volume  
  10.  
  11. limit0,20 

 

然后B库也同样执行这样的SQL,***在程序中将2个数据库返回的结果作一次合并,再取前20条返回给用户

但是这样就带来一个问题,你是不知道到底前20的数据是怎么分布的,是10条在A库,10条在B库,还是15条在A库,5条在B库,当用户翻到第二页的时候,就得在A库中查询前40条记录,B库中也查询前40条记录出来了...越是后面的页数,需要查询的量就越大(PS:当然你可以忽悠自己说绝大部分用户最多就看前3页的结果)

2.保证性能的方式:

这个就随意得多了,为了保证性能,正确性是不太可能保证的,可以每次在A库查10条,B库查10条,然后直接返回,结果肯定和实际的结果有出入,但相差不至太多,不是每个用户都会发现第2页的商品可能出现销量比第1页的商品销量还要大的情况。

以上两种方法都各有优缺点,但***的结果可能都不是我们想要的,可是问题出在哪?貌似只有这2种方法了。

其实这里涉及到的是应该如何去分库的问题,如果结果是按id排序的话,这样分库显然是没问题的,但如果是按销量排序的话,那数据库分库的时候其实应该按销量来切分,比如销量在100以内的放到A库,销量在100-1000的放到B库,这样查询起来就轻松多了,最关键的就是要知道,我们分库的规则应该怎么去设定。

关于数据库水平切分中分页查询的问题的解决方案就介绍到这里了,希望本次的介绍能够对您有所帮助。

【编辑推荐】

  1. 关于Oracle数据库闪回个性的详细介绍
  2. Oracle数据库对DDL语句和DML语句的事务管理
  3. Oracle数据库启动参数文件及相关SQL语句简介
  4. Oracle数据库的几种文件及表空间数据块的知识简介
  5. Oracle数据库查询登录用户名所属表空间及其使用情况
责任编辑:赵鹏 来源: CSDN博客
相关推荐

2009-11-18 16:10:00

2011-03-07 16:42:05

MySQL数据库安全

2011-07-26 16:05:19

Oracle数据库服务器

2018-03-26 12:58:52

数据库OracleMySQL

2010-05-27 18:24:09

MySQL数据库密码

2011-03-28 13:11:18

MySQL数据库安全

2011-03-03 18:09:14

2017-06-19 16:45:41

数据库水平切分用户中心

2010-05-13 10:27:24

MySQL数据库

2011-08-23 10:02:26

Oracle数据库存储过程挂死

2011-01-21 09:43:10

安恒数据库安全安全审计

2011-03-24 15:41:42

数据库

2011-08-03 14:02:02

数据库连接ACCESS

2009-05-15 10:11:55

数据库查询查询性能分页浏览

2018-12-29 14:26:58

物联网IOT物联网设备

2021-10-04 09:14:18

ElasticSear深度分页

2010-05-28 11:22:07

2012-07-23 14:30:33

Oracle

2009-03-31 11:57:52

2011-07-12 16:42:41

点赞
收藏

51CTO技术栈公众号