• 不同数据库的分页查询


    1、mysql分页查询

    方式1:

    select * from table order by id limit m, n; 

      该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录。无疑该查询能够实现分页功能,但是如果m的值越大,查询的性能会越低(越后面的页数,查询性能越低),因为MySQL同样需要扫描过m+n条记录。

    方式2:

    select * from table where id > #max_id# order by id limit n;

      该查询每次会返回n条记录,却无需像方式1扫描过m条记录,在大数据量的分页情况下,性能可以明显好于方式1,但该分页查询必须要每次查询时拿到上一次查 询(上一页)的一个最大id(或最小id)。该查询的问题就在于,我们有时没有办法拿到上一次查询(上一页)的最大id(或最小id),比如当前在第3 页,需要查询第5页的数据,该查询方法便爱莫能助了。

     方式3:

      为了避免能够实现方式2不能实现的查询,就同样需要使用到limit m, n子句,为了性能,就需要将m的值尽力的小,比如当前在第3页,需要查询第5页,每页10条数据,当前第3页的最大id为#max_id#:

     select * from table where id > #max_id# order by id limit 20, 10;

      其实该查询方式是部分解决了方式2的问题,但如果当前在第2页,需要查询第100页或1000页,性能仍然会较差。

    方式4:

     select * from table as a inner join (select id from table order by id limit m, n) as b on a.id = b.id order by a.id;

      该查询同方式1一样,m的值可能很大,但由于内部的子查询只扫描了字段id,而不是整张表,所以性能要强于方式1查询,并且该查询能够解决方式2和方式3不能解决的问题。

     方式5:

     select * from table where id > (select id from table order by id limit m, 1) limit n;

      该查询方式同方式4,同样通过子查询扫描字段id,效果同方式4。至于性能的话,方式5的性能会略好于方式4,因为方式5不需要在进行表的关联,而是一个简单的比较。


     2、sql server分页查询

    方式1:

        --pageSize 每页显示的数量
        --pageIndex 起始索引  

    select top pageSize * 
    from (select row_number() over(order by ID asc) as rownumber,*
    from student) temp_row
    where rownumber>((pageIndex-1)*pageSize);

    方式1-1:按照条件进行分组排序

        --pageSize 每页显示的数量
        --pageIndex 起始索引  

    select top pageSize * 
    from (select row_number() over(partition by CID order by ID asc) as rownumber,*
    from student) temp_row
    where CID=32 and rownumber>((pageIndex-1)*pageSize);

    方式2:

     

      假设页数是10,现在要拿出第5页的内容,查询语句如下:
      --10代表分页的大小

    复制代码
    select top 10 *
    from test
    where id not in
    (
     --40是这么计算出来的:10*(5-1)
     select top 40 id from test order by id
    )
    order by id
    复制代码

      原理:需要拿出数据库的第5页,就是40-50条记录。首先拿出数据库中的前40条记录的id值,然后再拿出剩余部分的前10条元素

     方式3:

      还是以上面的结果为例,采用另外的一种方法
      --数据的意思和上面提及的一样

    复制代码
    select top 10 *
    from test
    where id >
    (
     select isnull(max(id),0)
     from 
      (
       select top 40 id from test order by id
      ) A
    )
    order by id
    复制代码

       原理:先查询前40条记录,然后获得其最id值,如果id值为null的,那么就返回0,然后查询id值大于前40条记录的最大id值的记录。这个查询有一个条件,就是id必须是int类型的。

     方式3:

    复制代码
    select top 10 *
    from 
    (
     select row_number() over(order by id) as rownumber,* from test
    ) A
    where rownumber > 40
    复制代码

       原理:先把表中的所有数据都按照一个rowNumber进行排序,然后查询rownuber大于40的前十条记录
      这种方法和oracle中的一种分页方式类似,不过只支持2005版本以上的

     方式4:

       存储过程查询
       创建存储过程

    复制代码
    alter procedure pageDemo
    @pageSize int,
    @page int
    AS
    declare @temp int
    set @temp=@pageSize*(@page - 1)
    begin
     select top (select @pageSize) * from test where id not in (select top (select @temp) id from test) order by id
    end
    执行存储过程
    exec 10,5
    复制代码

    3、oracle分页查询

    方式1:

      根据ROWID来分

    select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from
    t_xiaoxi  order by cid desc) where rownum<10000) where rn>9980) order by cid desc;

      执行时间0.03秒

    方式2:

      按分析函数来分

    select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980;

      执行时间1.01秒

    方式3:

      按ROWNUM来分

    select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000) where

      rn>9980;执行时间0.1秒

      其中t_xiaoxi为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录
      个人感觉1的效率最好,3次之,2最差

  • 相关阅读:
    Linked List Cycle leetcode java (链表检测环)
    Remove Duplicates from Sorted List II leetcode java
    Remove Duplicates from Sorted List leetcode java
    Merge Two Sorted Lists leetcode java
    Swap Nodes in Pairs leetcode java
    Median of Two Sorted Array leetcode java
    阿里云最便宜的四种域名注册
    nohup和&后台运行,进程查看及终止
    ipv6转ipv4 NAT64与DNS64基本原理概述
    ros使用pppoe拨号获取ipv6,并且下发IPV6的dns到客户机win7
  • 原文地址:https://www.cnblogs.com/senfanxie/p/11128549.html
Copyright © 2020-2023  润新知