MySQL的分页查询通常通过limit来实现。limit接收1或2个整数型参数,如果是2个参数,第一个是指定第一个返回记录行的偏移量,第二个是返回记录行的最大数目。初始记录行的偏移量是0。为了与PostgreSQL兼容,limit也支持limit # offset #。

问题:

对于小的偏移量,直接使用limit来查询没有什么问题,但随着数据量的增大,越往后分页,limit语句的偏移量就会越大,速度也会明显变慢。

优化思想:避免数据量大时扫描过多的记录

解决:子查询的分页方式或者JOIN分页方式。JOIN分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。

下面举个例子。一般MySQL的主键是自增的数字类型,这种情况下可以使用下面的方式进行优化。

以真实的生产环境的6万条数据的一张表为例,比较一下优化前后的查询耗时:

-- 传统limit,文件扫描

[SQL]

SELECT * FROM tableName ORDER BY id LIMIT 50000,2;

受影响的行: 0

时间: 0.171s

-- 子查询方式,索引扫描

[SQL]

SELECT * FROM tableName

WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 50000 , 1)

LIMIT 2;

受影响的行: 0

时间: 0.035s

-- JOIN分页方式

[SQL]

SELECT * FROM tableName AS t1

JOIN (SELECT id FROM tableName ORDER BY id LIMIT 50000, 1) AS t2

WHERE t1.id <= t2.id ORDER BY t1.id LIMIT 2;

受影响的行: 0

时间: 0.036s

可以看到经过优化性能提高了很多倍。

优化原理:

子查询是在索引上完成的,而普通的查询时在数据文件上完成的。通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。因为要取出所有字段内容,第一种需要跨越大量数据块并取出,而第二种基本通过直接根据索引字段定位后,才取出相应内容,效率自然大大提升。因此,对limit的优化,不是直接使用limit,而是首先获取到offset的id,然后直接使用limit size来获取数据。

在实际项目使用,可以利用类似策略模式的方式去处理分页。例如,每页100条数据,判断如果是100页以内,就使用最基本的分页方式;如果大于100,则使用子查询的分页方式。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

.net mysql limit 分页原理_浅谈MySQL分页Limit的性能问题相关推荐

  1. mysql 计划任务消耗_浅谈MySQL event 计划任务

    一.查看event是否开启 show variables like '%sche%'; set global event_scheduler =1; 二. -- 设置时区并设置计划事件调度器开启,也可 ...

  2. mysql分区表的好处_浅谈MySQL分区表优点和限制

    分区是将一个表的数据按照某种方式,逻辑上仍是一个表,也就是所谓的分区表.分区引入了分区键的概念,分区键用于根据某个区间值(或者范围值).特定值列表或者hash函数值执行数据的聚集,让数据根据规则分布在 ...

  3. mysql表空间大小_浅谈mysql中各种表空间(tablespaces)的概念

    mysql中,会涉及到各种表空间的概念,虽然,很多方面这些概念和Oracle有相似性,但也有很多不同的地方,初学者很容易被这些概念弄的晕头转向,从而,混淆这些概念的区别和理解,下面,就简要介绍和说明一 ...

  4. mysql Pxc工作原理_浅谈MySQL-PXC架构

    一.PXC概述 PXC是基于Galera协议的MySQL高可用集群架构.具有高可用性.方便扩展且可以实现多个MySQL节点间的数据同步复制和读写,保证数据的强一致性.可以基本达到实时同步且相互的关系是 ...

  5. mysql表的类型_浅谈MySQL表类型

    MySQL为我们提供了很多表类型供选择,有MyISAM.ISAM.HEAP.BerkeleyDB.InnoDB,MERGE表类型,萝卜白菜各有所爱是不假,可是真正选择何种表类型还是要看业务需要啊,每一 ...

  6. mysql 添加唯一索引_浅谈Mysql索引

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询 ...

  7. mysql共享锁使用方法_浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景...

    Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |-- ...

  8. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  9. mysql 用户通配符_浅谈mysql通配符进行模糊查询的实现方法

    在mysql数据库中,当我们需要模糊查询的时候 ,我们会使用到通配符. 首先我们来了解一下2个概念,一个是操作符,一个是通配符. 操作符 like就是SQL语句中的操作符,它的作用是指示在SQL语句后 ...

最新文章

  1. C语言100个经典的算法
  2. android view的隐藏和显示_Android使用Viewpager实现3D卡片翻动效果
  3. php内存缓存设计,求选择哪个缓存设计好一些?
  4. 【alibaba-cloud】Gateway网关
  5. 特殊权限-软连接-硬链接
  6. 计算机vfp考试题库二级,XYZ计算机等级考试题库系统(二级VFP)
  7. 一分钟学会看k线图_K线图怎么看?一分钟学会看K线图
  8. android 自定义dialog 定时关闭,Android 快速实现自定义 Dialog
  9. YUM只下载软件不安装的设定
  10. 拓端tecdat|R语言状态空间模型:卡尔曼滤波器KFAS建模时间序列
  11. Android数据加载和Json解析——蓝本
  12. fd抓包数据类型_fiddler——抓包中的王者
  13. 炼丹中遇到的一些BUG
  14. 微信小程序开发工具下载及AppID查找
  15. ubuntu20.04安装Linux原生的微信,请注意,这不是wine版本的微信
  16. android 修改双卡铃声,Android 修改系统来电铃声
  17. 霍尼韦尔为重庆打造智慧口岸提供技术支持
  18. 表单_内置Filed
  19. 编程队伍队名_关于举办十四所第四届“国睿杯”青年软件技能编程大赛的通知...
  20. JavaScript中pageX pageY offsetX offsetY区别

热门文章

  1. 雷军:年轻人入职半年内不要提意见,不靠谱;微信表情新彩蛋遭疯狂吐槽:满屏“炸屎”;谷歌正式推出 Fuchsia OS|极客头条...
  2. 苹果公司支付1.13亿美元和解“降速门”指控;三大运营商或于年底联合宣布5G消息商用;DBeaver 7.2.5 发布|极客头条...
  3. 统信 UOS 适配支持百度飞桨 AI 深度学习平台;阿里回应“马云遭印度法院传唤”;fastjson 1.2.73 发布 | 极客头条
  4. 雷军说的 WiFi 6 到底是什么?
  5. Excel弱爆了!这个工具30分钟完成了我一天的工作量!
  6. 小米 10 年再创业,高端 5G 手机和 AIoT 有多少机会?
  7. Python 30 年技术演进史:生于小众,崛起 AI!
  8. 5G商用牌照近期发放;华为削减手机订单;苹果、亚马逊、Google遭调查 | 极客头条...
  9. Chrome 成为互联网看门人?!
  10. 互联网寒冬资讯分析报告!如何在“大裁员”下逆势而为?