百度空间 | 百度首页 
 
查看文章
 
MySQL与分页
2007年12月25日 星期二 下午 09:34
作者:老王

如果和MSSQL的TOP语法相比,那么MySQL的LIMIT语法要显得优雅了许多。使用它来分页是再自然不过的事情了。

最基本的分页方式:

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...

在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引:

举例来说,如果实际SQL类似下面语句,那么在category_id, id两列上建立复合索引比较好:

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10

子查询的分页方式:

随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似:

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10

一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。

此时,我们可以通过子查询的方式来提高分页效率,大致如下:

SELECT * FROM articles WHERE category_id = 123 AND id >= (
    SELECT id FROM articles ORDER BY id LIMIT 10000, 1
) LIMIT 10

----------------------------------------

实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。

类别:Database | 添加到搜藏 | 浏览() | 评论 (5)
 
网友评论:
2
2007年12月27日 星期四 上午 09:36 | 回复
http://mysqlbigram.googlepages.com/
 
3
2008年02月01日 星期五 下午 11:42 | 回复
你有测试过两条实际速度的差别吗?
 
4
2008年05月12日 星期一 上午 04:11 | 回复
这个效率不同的原理是什么? 另外子查询里面怎么还有order by 不是只需要一个结果吗?
 
5
2008年05月12日 星期一 下午 05:04 | 回复
To caicaimaopk: http://hi.baidu.com/thinkinginlamp/blog/item/17476d22d66876a14623e81d.html
 
6
2008年06月05日 星期四 下午 02:57 | 回复
我们现在的做法, 把前500页通通的memcache里去,,,,,
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu