这篇文章主要给大家介绍了关于MySQL查询中LIMIT的大offset导致性能低下的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

我们大家都知道,mysql查询使用select命令,配合limit,offset参数可以读取指定范围的记录,但是offset过大影响查询性能的原因及优化方法

我们在业务系统中难免少不了分页的需求。想到分页的时候,大家肯定会想到使用SQL中的LIMIT来实现。但是,如果不正确的使用LIMIT会导致性能问题(SQL执行得很慢、有可能会拖垮服务器),也会被领导批的;所以,我们来看看如何正确地使用LIMIT。

下面话不多说了,来一起看看详细的介绍吧

LIMIT OFFSET, ROW_COUNT 实现分页

存在性能问题的方式

?

1

SELECT * FROM myTable ORDER BY `id` LIMIT 1000000, 30

写出这样SQL语句的人肯定心里是这样想的:MySQL数据库会直接定位到符合条件的第1000000位,然后再取30条数据。
然而,实际上MySQL不是这样工作的。

LIMIT 1000000, 30 的意思是:扫描满足条件的1000030行,扔掉前面的1000000行,然后返回最后的30行。

较好的方式

?

1

2

3

4

5

6

7

8

9

10

SELECT t.*

FROM (

  SELECT id

  FROM myTable

  ORDER BY

    id

  LIMIT 1000000, 30

  ) q

JOIN myTable t

ON  t.id = q.id

大概的原理是:

  • 子查询只用到了索引列,没有取实际的数据,所以不涉及到磁盘IO,所以即使是比较大的 offset,查询速度也不会太差。

对具体的原理分析感兴趣的朋友可以看看这篇文章:MySQL ORDER BY / LIMIT performance: late row lookups

后记

未完待续。

参考资料

  • Why does MYSQL higher LIMIT offset slow the query down?
  • MySQL ORDER BY / LIMIT performance: late row lookups

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

来源:https://www.jb51.net/article/152041.htm

MySQL查询中LIMIT的大offset导致性能低下浅析相关推荐

  1. mysql limit offset很大_MySQL查询中LIMIT的大offset导致性能低下浅析

    前言 我们大家都知道,mysql查询使用select命令,配合limit,offset参数可以读取指定范围的记录,但是offset过大影响查询性能的原因及优化方法 我们在业务系统中难免少不了分页的需求 ...

  2. mysql 存储过程中limit

    mysql 存储过程中limit 1.mysql的高版本(5.5),存储过程中的limit可以使用变量,如下:select * from student limit iStart,iNum; 2.my ...

  3. mysql 空集 赋值_如何在MySQL查询中替换“空集”?

    要替换不存在的记录,请在MySQL中使用COALESCE.COALESCE将有助于替换NULL值.让我们首先创建一个表-create table DemoTable -> ( -> Cod ...

  4. 在MySQL查询中计算一个人的年龄

    最近在Phpfreaks.com论坛上提出了一个问题,即有人使用MySQL数据库存储用户出生日期的最佳方式.一个人建议使用varchar,因为他们最熟悉字符串函数.我的回答是使用MySQL日期类型. ...

  5. oschina mysql limit_Mysql中limit的用法

    Mysql中limit的用法:在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table ...

  6. java精准查询mysql时间_在mysql查询中查找与指定日期时间最接近的日期时间

    我试图在mysql数据库中找到一个datetime值,它与我指定的日期时间最接近,我遇到了一些麻烦 . 以下伪代码是我想要实现的: SELECT one FROM table WHERE dateti ...

  7. EF Core For MySql查询中使用DateTime.Now作为查询条件的一个小问题

    背景 最近一直忙于手上澳洲线上项目的整体迁移和升级的准备工作,导致博客和公众号停更.本周终于艰难的完成了任务,借此机会,总结一下项目中遇到的一些问题. EF Core 一直是我们团队中中小型项目常用的 ...

  8. mysql更新id最大_我们可以在单个MySQL查询中更新具有最高ID的行吗?

    是的,我们可以做到.让我们首先创建一个表-mysql> create table DemoTable ( ID int, GameScore int ); 使用插入命令在表中插入一些记录-mys ...

  9. php mysql group by_php – 如何在mysql查询中解决“不在GROUP BY中”错误

    我有两个模型:帖子和喜欢有一对多的关系(所以,一个帖子有很多喜欢). Likings模型还有一个isActive字段,表示喜欢是主动还是被动. 我想获得(排序)前5个帖子,这些帖子已经收到了最大的&q ...

最新文章

  1. ORB_SLAM2代码阅读(2)——tracking线程
  2. 用g.raphael.js高速绘制饼图、柱状图、点状图、折线图(上)
  3. ubuntu wps
  4. a/a的4种链接方式
  5. 计算机网络之传输层:7、TCP拥塞控制
  6. vue读取外部配置文件
  7. linux查看网络响应时间,Linux netperf网络性能测试
  8. Docker——网络
  9. python里str什么意思_python中str是什么意思
  10. 怎么把html放到速卖通详情,速卖通详情页布局怎么弄?
  11. 【Audio】声临其境——杜比音效介绍
  12. 初中计算机表格处理教案,初中信息技术Excel教案设计
  13. Maven使用与学习
  14. 你不知道的互联网公司招聘黑话大全
  15. Sphinx(斯芬克斯的安装及使用)
  16. w ndows11如何设置电源选项,2018年度巨献(4):11款650W全模组80Plus金牌+电源横评
  17. 如何用大数据进行咖啡店选址要素分析
  18. BERT微调做中文文本分类
  19. 消灭该死的重复 下(1)布尔运算 boolean
  20. 罗克韦尔CompactLogix 控制系统PLC如何借助工业网关实现远程编程维护?

热门文章

  1. c++多个对象构造和析构
  2. 4 C++对C的加强之namespace命名空间
  3. 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC
  4. 第十天:估算活动持续时间,类比估算,参数估算,自下而上估算,三点估算解析表
  5. 用cxf公布和调用web service
  6. Java 中按文件名称分类,按文件大小分类,按照文件类型分类,按照最后修改时间分类的工具类
  7. 处理时间_6_SQL Server常见的时间格式转换
  8. CentoS8 Mysql8 数据目录迁移
  9. Kettle使用_4 Excel批量数据输入
  10. windows下VS2015配置caffe