首页 > 数据库 >MySQL分页查询offset过大,Sql优化经验

MySQL分页查询offset过大,Sql优化经验

时间:2024-06-10 16:15:41浏览次数:38  
标签:Sql offset 主键 OFFSET MySQL table where id

低性能版

SELECT
*
FROM table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000

当offset特别大时,这条语句的执行效率会明显减低,而且效率是随着offset的增大而降低的。
原因为:
MySQL并不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回N行,当offset特别大,然后单条数据也很大的时候,每次查询需要获取的数据就越多,自然就会很慢。

优化版本

SELECT
*
FROM table
JOIN
(select id from table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000)
as tmp using(id)

或者

SELECT a.* FROM table a, 
(select id from table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000) b 
where a.id = b.id

先获取主键列表,再通过主键查询目标数据,即使offset很大,也是获取了很多的主键,而不是所有的字段数据,相对而言效率会提升很多。

标签:Sql,offset,主键,OFFSET,MySQL,table,where,id
From: https://www.cnblogs.com/martindai/p/18240738

相关文章

  • C语言 & 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】
      博客主页:花果山~程序猿-CSDN博客文章分栏:MySQL之旅_花果山~程序猿的博客-CSDN博客关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长!目录一.配置开发环境 二,接口介绍1.mysql_init2.mysql_real_connect3.mysql_query4.对select结果分析......
  • MySQL 存储函数及调用
    1.mysql存储函数及调用在MySQL中,存储函数(StoredFunction)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单和高效。下面是一个具体的MySQL存储函数的示例,该函数接受一个整数......
  • 【C语言】宏offsetof的模拟实现(计算结构体中某变量相对于首地址的偏移)
    首先我们应该特别留意:offsetof是一个宏,并非是一个函数!宏offsetof的介绍:参数:第一个是结构体类型名称,第二个是结构体成员名返回类型:size_t无符号整形引用的头文件:<stddef.h>offsetof的使用举列:#include<stddef.h>structStu//注释为相对于起始位置的偏移量{......
  • MySQL逻辑备份
    目录一.mysqldump基本命令:常用选项:示例备份整个数据库 备份多个数据库 备份所有数据库 仅备份数据库结构仅备份特定表添加选项以有效处理锁表问题恢复数据库从逻辑备份文件恢复注意事项二. mysqlpumpmysqlpump 特点基本命令:常用选项:示例备份单个数据库......
  • 1900springboot VUE 生态菜园管理系统开发mysql数据库web结构java编程计算机网页源码m
    一、源码特点 springbootVUE生态菜园管理系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSPjava编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。前段主要技术vue 后端主......
  • Python程序操作MySQL数据库教程
    1.Python程序操作MySQL数据库:使用pymysql安装包使用:1.导入pysql包importpymysql2.创建连接对象调用pymysql模块中的connect()函数来创建连接对象,代码如下:连接对象说明:关闭连接conn.close()提交数据conn.commit()撤销数据conn.rollback()3.获取游标对象获取......
  • Android studio 连接sqlist数据库,账号密码错误仍能登录的原因
    昨天在写Androidstudio的大作业,写到连接sqlist数据库实现登录的时候明明账号密码都不正确,但是用户却可以登录,我原先以为是我sql语句写错了,将sql语句从Cursorcursor=db.rawQuery("select*fromuserwherenamelike?andpasswordlike?",newString[]{name,password});改......
  • [转帖]企业如何做好SQL质量的管理?
    点击标题下「蓝色微信名」可快速关注SQL操作数据库对应软件研发人员是一类基础且常见的工作内容,无论是日常的数据库应用开发,还是配合数据库产品迁移的应用改造,数据库设计和SQL的质量都是值得关注的问题。目前业界有很多提供SQL质量管理的产品,甲方也会有很多自研实现相关功......
  • MySQL操作 UPDATE、SELECT、UNION、IN、DISTINCT
    update更新所有人的年龄加一:updateusersetage=age+1;只更新某个:updateusersetage=age+1wherename='zhangsan';select查询select*fromuser;//一般不建议使用通配符selectname,age,sexfromuser;//根据键查找selectname,age,sexfromuserwheresex='......
  • MySQL数据库---LIMIT、EXPLAIN详解
    分页查询语法select_column,_columnfrom_table[whereClause][limitN][offsetM]select*:返回所有记录limitN:返回N条记录offsetM:跳过M条记录,默认M=0,单独使用似乎不起作用limitN,M:相当于limitMoffsetN,从第N条记录开始,返回M......