博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL提升效率之limit
阅读量:4262 次
发布时间:2019-05-26

本文共 1231 字,大约阅读时间需要 4 分钟。

      分页查询在我们的实际工作中经常会遇到,但是对于不同的数据库,分页查询的实现方式也不一样。而在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-1’ ORDER BY postdate DESC LIMIT  20;

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

SELECT * FROM pw_gbook WHERE uid='48' and postdate>’2009-11-3’ ORDER 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-3’  ORDER BY postdate DESC LIMIT  40,20;

      看到这里明白为什么大型网站的分页不是一下标识出来完了,让都能点了吧。也不会给你一个框让你输入一个页跳过去了。如果跳的页面过多,也就存在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.

转载地址:http://ifmei.baihongyu.com/

你可能感兴趣的文章
【Lintcode】寻找峰值
查看>>
Arduino 串口读写 SD 卡模块
查看>>
基于Flink+ClickHouse打造轻量级点击流实时数仓
查看>>
Flink sink schema 字段设计小技巧
查看>>
Flink 使用 union 代替 join 和 cogroup
查看>>
踩坑记 | Flink 天级别窗口中存在的时区问题
查看>>
用了 History Server,妈妈再也不用担心我的 Flink 作业半夜挂了
查看>>
强烈推荐三本 Spark 新书籍
查看>>
ClickHouse 如何玩转时序数据
查看>>
Flink 在腾讯视频的应用实践
查看>>
Flink SQL 1.11 on Zeppelin 平台化实践
查看>>
通过项目逐步深入了解Mybatis<三>
查看>>
奇怪的Java题:为什么128 == 128返回为False,而127 == 127会返回为True?
查看>>
java读取文件
查看>>
【二叉树】二叉树打印
查看>>
【字符串】字符串逆序
查看>>
【字符串】判断两字符串是否互为旋转词?
查看>>
【排序】时间复杂度为O(N^2)的排序——冒泡、选择和插入排序
查看>>
Typora Markdown 语法
查看>>
【IO】程序访问文件的几种方式
查看>>