MySQL提升效率之limit

时间:2021-07-26 09:07:43

      分页查询在我们的实际工作中经常会遇到,但是对于不同的数据库,分页查询的实现方式也不一样。而在MySQL中的分页就是靠limit实现的,可是limit的效率怎么样呢,我们来看看。

1、分页问题

      我这里简单说一下LIMIT的原理。这里以LIMIT N,M为基础:LIMIT首先要找查N+M行,然后从N行处,取M行。那么这样的SQL对一次查询1275500一个操作应该是一个昂贵的开销。对于LIMIT这类的优化,第一个目标就是让N变的尽可能的小或是不用。

2、优化方案

  • 翻页

      我们可以给分页一个提示。如现在我们看的是第5页,看完看想看第6页,第6页同样显示是20条记录。
      我们就可以想到,以这个例子为准:我们可以肯定的是第6页的日值应小于第5页的,如果第5页的最小日值为:2009-11-4,那我们就可以用:

SELECT * FROM pw_gbook WHERE uid='48' and postdate<’2009-11-1ORDER BY postdate DESC LIMIT  20;

      这样来查询第6页的内容。同样对于查看第4页的内容(假设第5页的最大日期为:2009-11-3)则第4页的内容为:

SELECT * FROM pw_gbook WHERE uid='48' and postdate>’2009-11-3ORDER BY postdate DESC LIMIT  20;

      当然,这是一个基本的思想,我们需要对每页数据进行排序。

  • 跳页

      如果显示 “ 1,2,3,4,5…”,可以跳页,如从第二页跳到第5页,这里有一个第二页的最小日期为:2009-11-3(假设值,可以由第二页的程序查询得到),第二到第5,差2页,每页20条记录,那么就可以用:

SELECT * FROM pw_gbook WHERE uid='48'  and postdate<’2009-11-3ORDER BY postdate DESC LIMIT  4020;

      看到这里明白为什么大型网站的分页不是一下标识出来完了,让都能点了吧。也不会给你一个框让你输入一个页跳过去了。如果跳的页面过多,也就存在N值过大的问题了。所以要想办法必免。

  • 转换方案

      我么可以利用其它的唯一标识来比较,从而可以实现分页

原查询

SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;

转换成

SELECT * FROM pw_gbook WHERE id>1275480 and uid='48' ORDER BY postdate DESC LIMIT 20;

总结:

      我们在写代码的过程中,不仅要关注功能的实现,还要考虑其性能的优化。如何写出高质量的代码,那需要我们多看源码,多思考自己代码。不管多大的成就,都是靠一点点努力积累起来的,just do it.