首页 > 数据库技术 > 详细

mysql分页查询详解

时间:2016-01-04 19:55:25      阅读:269      评论:0      收藏:0      [点我收藏+]

  我们做的后端项目一般都会有admin管理端,当管理端将要展示数据的时候,就需要用到分页。所以分页的考查在面试中也相当多。在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用order by来排序。但是在表数据量比较大的时候,例如查询语句片段limit 10000,20,数据库会读取10020条数据,然后把前10000条丢弃,把最后的20条返回给你,这种消耗是可以避免的,也是没必要的。下边介绍几种优化方法:

1. 让分页操作在索引中进行

    一般表中经常作为条件查询的列都会建立索引,例如如下查询

SELECT 
    msg_id, 
    msg_content 
FROM message 
ORDER BY 
    gmt_create desc 
LIMIT 100, 20;  

可以写成如下方式

SELECT 
    msg_id, 
    msg_content 
FROM message   
INNER JOIN (  
    SELECT 
        msg_id 
    FROM message  
    ORDER BY gmt_create 
    LIMIT 100, 20  
) AS page USING(msg_id);      

 这样当前查询页的内容就只会在索引中进行,当得到当前页的msg_id再统一通过一个INNER JOIN得到最终要得到的数据详情,避免了对大量数据详情进行操作的消耗。当然JOIN操作也可以通过子查询实现,不过书中介绍5.6之前版本的mysql相比子查询还是优先使用JOIN。

2. 显式指定要查询的索引列范围

  如方法一中的gmt_create是建立索引的列,而且你也知道要查询的时间范围,这样你就可以通过如下查询语句:这样数据库通过一个范围查询就可以得到想要的数据。

SELECT 
    msg_id, 
    msg_content 
FROM message  
WHERE gmt_create BETWEEN #startTime# AND #endTime#  
ORDER BY gmt_create desc

3. OFFSET作为查询条件显式指定

我们可以在查询参数中显式指定一个查询时间,叫做lastVisitTime吧。我们查询第一页可以用如下语句:

SELECT 
    msg_id, 
    msg_content 
FROM message  
ORDER BY gmt_create desc  
LIMIT 20

 我们把读出来的数据的最后一条数据的gmt_create字段记录在lastVisitTime字段中,那么后边页的查询就可以用如下语句实现:这种查询方式,无论你查询多少页,分页都不会是影响效率的因素。

SELECT 
    msg_id, 
    msg_content 
FROM message  
WHERE gmt_create < #lastVisitTime#  
ORDER BY gmt_create desc  
LIMIT 20; 

mysql分页查询详解

原文:http://www.cnblogs.com/RunForLove/p/5100009.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!