您的位置:首页 > 数据库 > SQL

高效提高分页效率的方法

2009-09-28 10:05 232 查看
原文地址http://www.trac.net.cn/2009/03/php-mysql-page-limit.html

版权声明:所有版权归原作者所有

 

分页是数据库系统中,尤其是网页中常见的功能。数量级在一万以下时,分页的性能问题觉察不出来;当在数量在一万到100万之间时,有点担心性能问题;当数量过百万时,分页性能是必须考虑的问题了。

传统方案: 索引
索引可以明显提高索引性能,自然索引可以提高分页性能。但是即使一个简单的表,每页10条,当查看1000页时,估计性能已经不能让人满意了。如何优化?

/**********************
补充一点:
当你的查询是比较复杂时,索引是不是恰当也是值得注意的地方。如果你知道联合索引是怎么回事,什么地方使用,那么你可以略过此段。以下面的SQL为例:
SELECT * FROM TABLEA WHERE F1 = 'value' AND F2 = 'value'
如果只是针对F1, F2单独建了索引,而没有建联合索引,则当分别符合F1, F2条件的两个记录集中数量最小某的仍然很大时,速度就不理想了。这是因为使用F1索引,但是F2的索引没有用上劲;或者,反之。如果优化索引呢,得建(F1,F2)的联合索引,这样上面的SQL语句就很快了。
***********************/

一点小技巧:
使用联合索引后,前几百页很快了。但是越往后,速度越慢;现在咱们使用一个技巧,最后几页,肯定是使用倒序的第一页,以此类推。  这样,分页的最后和最后都很快了。也许各位要较真了,正序和倒序的重合部分怎么办?几条记录即出现在第N页上,又出现在N+1页上,怎么办?其实这个问题不大,想一想,这个技巧只有当页码超过某个数量级之后才会应用。那时,已经无人会注意这些细节了。

大大的技巧:
联合索引可以极大提高搜索速度,能不能把分页转换成条件检索呢,换句话说,SQL始终在执行某一条件的LIMIT 10。当然可以了,我们分页时基本上按照自动编号的ID进行排序(一定意义上等同于按照时间排序)。如果每次翻页时,把当前页的最后一个ID传过去,构建SQL语句时,除了应用之前的检索条件,再加上ID范围限制,这样下一页呈现时,只需要搜索前几条就可以了。SQL语句部分不存在分页的问题了。比如构建后的SQL可能是这样的:
SELECT * FROM TABLEA WHERE F1 = 'value' AND F2 = 'value' AND ID 《2222 limit 10
当然,这样速度快的前提是建好联合索引 (F1,f2, ID)
虽然这个技巧很好,但是必须对URL传入的参数得做安全验证。一个比较好的方法就是对参数进行加密。

废话:
把所有的数据全部分页呈现给用户,这样的需求可能被一点点折中(只显示前几十页)所打消。因为没人会去看几万页,所以baidu,google返回结果中也只有那么几十页而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息