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)进行查询:
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)进行查询:
相关文章推荐
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句 (转)
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句
- MySql实现分页查询的SQL,mysql实现分页查询的sql语句
- 利用标准的SQL语句实现查询记录分页
- 【转】在SQL Server中通过SQL语句实现分页查询
- 在SQL Server中通过SQL语句实现分页查询(转)
- 用标准的SQL语句实现查询记录分页
- 3大数据库(Sql-Server,MySql和Oracle)的分页SQL语句实现
- sqlserver/mysql/oracle实现sql语句分页方法
- 使用传入的总记录数实现一条sql语句完成分页查询
- 在SQL Server中通过SQL语句实现分页查询
- 在SQL Server中通过SQL语句实现分页查询
- SQL server、MySQL、Oracle分页查询SQL语句
- Oracle,SQl,MySql实现分页查询
- mysql、MS SQL关于分页的sql查询语句 limit 和row_number() OVER函数
- 用标准的SQL语句实现查询记录分页
- 利用标准SQL语句实现查询记录分页
- 用标准的SQL语句实现查询记录分页
- MySql的sql语句中添加存储过程或者存储函数来实现Oracle中的start with ……connect by prior……递归(树形结构数据)查询