注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小葫芦君(汉斯的博客)

博客迁移到新博客:https://blog.ssxingshou.com

 
 
 

日志

 
 
关于我

小小葫芦商城,为您提供高品质的商品,一流的产品,一流的包装服务,一流的物流服务,放心购买

网易考拉推荐

性能优化:Oracle,SqlServer,MySql高性能分页方案  

2011-11-29 11:14:47|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

SQL Server 2000

PageCount:一页需要的数据条数
PageIndex:页索引

select top PageCount * from (
     select top PageCount * from (
         select top PageCount*PageIndex  *  from tableName order by ID) as tmp1 order by ID DESC
     ) as tmp2 order by ID
)

解释一下,比如在论坛中,有100条帖子,每一页显示20条帖子,如果显示第2页。则,先按照时间排序,取出前40条记录,然后40条记录按照时间反过来排序,取出前20条记录,再按照时间排序一次,按照正常的顺序读出来。所以,这个分页是三重top组合排序。


Oracle 9i+:


SQL:普通的Select语句

FromIndex:从…条

ToIndex:到…条

通用的方式:

select * from (
     select row_.*, rownum rownum_ from (
       SQL
) row_ where rownum <= toIndex
) where rownum_ > fromIndex

解释一下,还是上面的例子,先按照时间顺序查询出来,rownum是查询结果的序号,如果是第2页的话,取出第0到40(<=toIndex)条帖子。然后取出>20的帖子。

有唯一标识符(ID字段)的情况排序

select * from tableName where ID in(
  select ID from (
    select rownum rownum_,ID from (
      select ID from tableName order by Code
    ) where rownum <= toIndex
  ) where rownum_ > fromIndex
)

=======================================
Mysql的分页

通用的情况是这样的:

SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20

文中提到一种”clue”的做法,给翻页提供一些”线索”,比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是9527,最小的是9500,如果我们只提供”上一页”、”下一页”这样 的跳转(不提供到第N页的跳转),那么在处理”上一页”的时候SQL语句可以是:

SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20;

处理”下一页”的时候SQL语句可以是:

SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 20;

不管翻多少页,每次查询只扫描20行。

我认为这是在原有的分页基础上的一个突破。对于SqlServer和Oracle的分页也很借鉴意义。有条件的可以改写SqlServer和Oracle的翻页Sql,加上Where条件。如果不加条件限制,可以看到越向后翻,性能是越低的,最后一页就是全表扫描了。如果加上限制,时间几乎是常数了。分页中,索引也非常重要,在索引列上一定需要建索引,避免全表扫描。

总结起来就几句话:

SqlServer用top,

Oracle用rownum,

MySql用Limit,

排序列建Index,

加上Where条件,

分页高性能。

  评论这张
 
阅读(1140)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017