在实际的项目中,分页查询是在寻常不过的,甚至说不可避免的。通常数据量较少的时候,很难遇到效率的影响。但是当数据量较大时,一个普通的分页sql能让你恶心到家。

我们常用的分页sql如下:

1 SELECT * FROM table_name LIMIT 20 OFFSET 10;

这个sql不会耗时很久,因为偏移量offset很小,但是当offset很大时,这个sql的执行时间完全超乎你的想象,网上有很多测试的例子,这里不再复制粘贴。另外一个因素就是我们在查询数据的时候,通常不会查询过多的页数,一般也就看几页而已,所以不会出现这样的问题。所以写这篇博客的目的不是为了解决问题,而是希望能够养成一个好习惯,分页的sql到底该怎么写。

这里说一个额外的话,很多新人一直不理解,建表的时候为什么一定要有主键id,如果仅仅是为了非空唯一,完全可以自定义一个非空唯一的字段。mysql会为主键添加一个主键的索引,这个索引在查询数据的时候很有帮助,所以最好为你的表添加主键。这里我们也用主键来解决这个问题。

推荐方式1:

1 SELECT * FROM table_name t1 JOIN (SELECT id FROM table_name ORDER BY id LIMIT 10 OFFSET 200) t2 ON t1.id = t2.id

将分页的压力通过主键的索引来解决,在子查询中完成分页条件。

推荐方式2:

1 SELECT * FROM table_name WHERE id >= (SELECT id FROM table_name ORDER BY id LIMIT 1 OFFSET 200) LIMIT 10

依然是将分页的压力通过主键索引来解决,可见主键的重要性。我这里的id是bigint自增的,所以可以用>=来判断,如果是字符串,改成IN即可。不过不推荐字符串作为id,而且IN的效率也一般般,考虑方式1不错。

这里着重说一下,为什么子查询要有order by,网上很多例子都没有的。select * from table_name limit 1返回的是数据库的第一条数据,但是select id from table_name limit 1未必返回的是第一条数据,id未必是最小的。默认的排序规则应该与查询结果有关系,这里也仅仅是猜测而已,建议limit还是与order by一起用更好一些。

这里没有讲什么技术,只是一个小小的技巧而已,希望以后写分页的时候能够采用这两种方式,避免最原始的。良好的习惯会为你避免很多意想不到的问题!

mysql分页查询减轻压力_mysql分页查询优化相关推荐

  1. mysql 慢查询sql实例_MySQL慢查询优化案例一

    这是学习笔记的第1946篇文章 最近整理了一个慢日志排行榜,可以从一个整体的角度来看到整个数据库方向的慢日志情况,我的初步目标是坚持一段时间,每天争取优化一个慢查询语句.通过这个过程来梳理一些SQL性 ...

  2. php redis 分页查询,redis如何解决分页查询

    我们都知道,通过缓存查询的结果,可以极大的提升系统的服务能力,以及降低底层服务或者是数据库的压力.对于有分页条件的缓存,我们也可以按照不同的分页条件来缓存多个key. 基于SortedSet的分页查询 ...

  3. oracle分页查询sql语句通用,oracle分页查询sql语句,oracle分页查询sql语句详解

    oracle分页查询sql语句,oracle分页查询sql语句详解,Oracle分页查询sql语句 Oracle中分页和MySql中的分页不同,MySql中的分页使用关键字limit即可,相对简单一点 ...

  4. springboot controller 分页查询_Spring Boot实战分页查询附近的人: Redis+GeoHash+Lua

    您的支持是我不断创作巨大动力 CSDN博客地址(关注,点赞) 人工智能推荐 GitHub(Star,Fork,Watch) 前言 最近在做社交的业务,用户进入首页后需要查询附近的人: 项目状况:前期尝 ...

  5. mysql分页查询所有数据库_MySQL 数据库 分页查询/聚合查询

    引言 在本篇博客简单介绍一下分页查询以及聚合查询简单操做.html 分页查询 在MySQL中,分页查询通常都是使用limit子句实现,limit子句声明以下:mysql SELECT * FROM t ...

  6. mysql嵌套查询;去重,分页综合查询

    整体sql select s.name from (select DISTINCT t.name from desg_sheet_ref t WHERE id= 111 and name= 'xxx' ...

  7. mysql慢查询 如何构造_mysql如何构造慢查询

    mysql怎样实现time转datetime mysql实现time转datetime的方法:使用在sql语句中[FROM_UNIXTIME(时间值)],代码为[insert into test(ti ...

  8. springboot controller 分页查询_Spring Boot实战分页查询附近的人:Redis+GeoHash+Lua

    前言 最近在做社交的业务,用户进入首页后需要查询附近的人: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的经纬度: 用户在每次启动 ...

  9. java 分页查询_java开发之分页查询

    工具类 package com.luer.comm.utils; import java.util.List; public class PageBean { //已知数据 private int p ...

最新文章

  1. Gradle入门系列(4):创建二进制发布版本
  2. centos7安装单节点mysql(源码包安装)
  3. Delphi XE2 新控件 布局Panel TGridPanel TFlowPanel
  4. 上海社保,统筹内不能转出的疑惑
  5. python random函数_详细代码实战讲解:如何用 Python让自己变成天选之子
  6. poj 1180 斜率优化dp
  7. Linux Python 安装第三方库时报错 package wheel is not installed
  8. 用友发布智多星 AI 企业大脑,其核心组成原来是这样的
  9. Eclipse—如何为Eclipse开发工具中创建的JavaWeb工程创建Servlet
  10. SPSS 单因素方差分析(图文+数据集)【SPSS 018期】
  11. html5字体的格式转换,font字体
  12. 一般意义的resolution地图分辨率和比例尺理解
  13. 【线性代数】6-5:正定矩阵(Positive Definite Matrices)
  14. 数据结构:八大数据结构分类及图解
  15. 压缩感知学习(一):压缩感知的起源
  16. 基于Pytorch源码对SGD、momentum、Nesterov学习
  17. 强势文化需要包容和创新
  18. 编写程序,从键盘输入任意一个字符,输出该字符是英文字母(不区分大小写)、数字字符还是其它字符。
  19. Hive---外部表和内部表
  20. Mark Twain — The Licensed Jester

热门文章

  1. jpa mysql查找_jpa查找数据库最新一条消息
  2. Common Number(奇偶二分+找规律)
  3. html怎么给边框改样式,html里面怎么设置边框?html边框样式设置方法
  4. linux上qt配置opengl,Ubuntu下配置Qt+OpenGL+OpenCV
  5. 整数和小数的移码计算方法
  6. *PAT_B_1014_Java(20分)
  7. 【数据库】数据库系统的结构(概念篇详解)
  8. 实验7-3-1 字符串逆序 (15分)
  9. sql 倒数第二个_小白初探SQL(一)
  10. Java学习笔记_匿名/ArrayList