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

MySql实现分页查询的SQL,mysql实现分页查询的sql语句

2017-03-15 14:04 609 查看
refs:
http://blog.csdn.net/sxdtzhaoxinguo/article/details/51481430
摘要: MySQL数据库实现分页查询的SQL语句写法!

一:分页需求:

客户端通过传递start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和我们的需求不一样,所以就需要我们根据实际情况去改写适合我们自己的分页语句,具体的分析如下:

比如:

查询第1条到第10条的数据的sql是:select * from table limit 0,10;   ->对应我们的需求就是查询第一页的数据:select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:select * from table limit 10,20;  ->对应我们的需求就是查询第二页的数据:select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:select * from table limit 20,30;  ->对应我们的需求就是查询第三页的数据:select * from table limit (3-1)*10,10;

二:通过上面的分析,可以得出符合我们自己需求的分页sql格式是:

select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显示的条数。

三:当数据较多时

对上面的mysql语句说明:limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里,如果是limit 100000,100,需要扫描100100行,在一个高并发的应用里,每次查询需要扫描超过10W行,性能肯定大打折扣。文中还提到limit n性能是没问题的,因为只扫描n行。

第二部分:根据雅虎的几位工程师带来了一篇Efficient Pagination Using MySQL的报告内容扩展:在文中提到一种clue的做法,给翻页提供一些线索,

比如还是SELECT * FROM message ORDER BY id DESC,按id降序分页,每页20条,当前是第10页,当前页条目id最大的是10020,最小的是10000,

如果我们只提供上一页、下一页这样的跳转(不提供到第N页的跳转),那么:

下页:从id=10021~10040这页,代码如下:

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

上页:从id=9980~10000这页,SQL语句可以是:

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

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

解决大数据量翻页问题

1、将LIMIT M,N的查询改为LIMIT N

例如,使用LIMIT 10000,20,Mysql将需要读取前10000行,然后获取后面的20行 ,这是非常低效的,使用LIMIT N的方式,通过每页第一条或最后一条记录的id来做条件筛选,再配合降序和升序获得上/下一页的结果集 。

2、限制用户翻页数量

产品实际使用过程中用户很少关心搜索结果的第1万条数据。

3、使用延时关联通过使用覆盖索引来查询返回需要的主键,再根据返回的主键关联原表获得需要的行,这样可以减少Mysql扫描那些需要丢弃的行数。

实例:
使用索引(sex,rating)进行查询:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: