MySQL的limit用法和分页查询的性能分析及优化

147 篇文章 35 订阅
订阅专栏
3 篇文章 0 订阅
订阅专栏

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

SELECT * FROM table LIMIT [offset,] rows | `rows OFFSET offset ` 
(LIMIT offset, `length`)
SELECT
*
FROM table
where condition1 = 0
and condition2 = 0
and condition3 = -1
and condition4 = -1
order by id asc
LIMIT 2000 OFFSET 50000

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15 

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:

mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. 

//如果只给定一个参数,它表示返回最大的记录行数目:
mysql> SELECT * FROM table LIMIT 5;//检索前 5 个记录行
//换句话说,LIMIT n 等价于 LIMIT 0,n。

二、Mysql的分页查询语句的性能分析
MySql分页sql语句,如果和MSSQL的TOP语法相比,那么MySQL的LIMIT语法要显得优雅了许多。使用它来分页是再自然不过的事情了。

最基本的分页方式:

SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... 

在中小数据量的情况下,这样的SQL足够用了,唯一需要注意的问题就是确保使用了索引:
举例来说,如果实际SQL类似下面语句,那么在category_id, id两列上建立复合索引比较好:

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10

子查询的分页方式:

随着数据量的增加,页数会越来越多,查看后几页的SQL就可能类似:

SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10

一言以蔽之,就是越往后分页,LIMIT语句的偏移量就会越大,速度也会明显变慢。
此时,我们可以通过子查询的方式来提高分页效率,大致如下:

SELECT * FROM articles WHERE  id >=  
(SELECT id FROM articles  WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10 

JOIN分页方式

SELECT * FROM `content` AS t1   
JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2   
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize; 

经过我的测试,join分页和子查询分页的效率基本在一个等级上,消耗的时间也基本一致。
explain SQL语句:

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> system NULL NULL NULL NULL 1  
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where
2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index

为什么会这样呢?因为子查询是在索引上完成的,而普通的查询时在数据文件上完成的,通常来说,索引文件要比数据文件小得多,所以操作起来也会更有效率。

实际可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。

三、对于有大数据量的mysql表来说,使用LIMIT分页存在很严重的性能问题。
查询从第1000000之后的30条记录:

SQL代码1:平均用时6.6秒 SELECT * FROM `cdb_posts` ORDER BY pid LIMIT 1000000 , 30

SQL代码2:平均用时0.6秒 SELECT * FROM `cdb_posts` WHERE pid >= (SELECT pid FROM  
`cdb_posts` ORDER BY pid LIMIT 1000000 , 1) LIMIT 30

因为要取出所有字段内容,第一种需要跨越大量数据块并取出,而第二种基本通过直接根据索引字段定位后,才取出相应内容,效率自然大大提升。对limit的优化,不是直接使用limit,而是首先获取到offset的id,然后直接使用limit size来获取数据。

可以看出,越往后分页,LIMIT语句的偏移量就会越大,两者速度差距也会越明显。

实际应用中,可以利用类似策略模式的方式去处理分页,比如判断如果是一百页以内,就使用最基本的分页方式,大于一百页,则使用子查询的分页方式。

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

这里写图片描述

为了保证index索引列连续,可以为每个表加一个自增字段,并且加上索引

本文章转自:https://segmentfault.com/a/1190000008859706

MySQL】过滤后的结果集较大,用LIMIT查询分页记录,查询效率不理想
dongjizheng9270的博客
02-18 156
> 参考的优秀文章 优化LIMIT分页--《高性能MySQL》(电子工业出版社) > 场景描述 遇到一个场景:查询排序后的结果集较大,我们采用分页显示,每页显示20条记录,但是查询效率还是不尽理想。 结果,采用以下两个手段优化效率: 1、对排序的字段加上索引(普通索引,即BTREE),加了索引后,普通查询的效率加快了,但偏移量大的数据(比如排序靠后的数据)查询...
MySQLLIMIT 使用详解
最新发布
qq_59998784的博客
08-08 1465
本文主要对MySQL语法中 limit 进行了
mysql limit分页查询优化写法
SiC B2B2C Shop大型B2B2C商城软件产品,使用Java语言开发,高性能高扩展性高安全性分布式。可帮助你快速的建立大型B2B2C电商系统
08-07 210
mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用orderby排 序。但是在表数据量比较大的时候,例如查询语句片段limit 10000, 20,数据库会读取10020条数据,然后把前10000条丢弃,把最后的20条返回给你,这种消耗是可以避免的,也是没必要的。下边介绍几种优化方法:  优化方法1(让分页操作在索引中进行):  一般表中经常作为条件查询的列都会建立索引...
mysql limit分页性能优化
beiduofen2011的专栏
04-04 652
如有张表task_monitor_run_log_info 获取这张表数据的大小: 数据量大小差不多2000w条,查询一共差不多2分钟,所以,我们一般发现表数据量超过500w行,就要实行分库分表 使用limit进行分页: SELECT * FROM `task_monitor_run_log_info` limit 2000000,10 我们发现全表扫描了,再看下数据 SELECT * FROM `task_monitor_run_log_info` a IN...
关于MySQL中查询大数据量的情况下分页limit性能优化
张小洛的BOLG
06-22 7837
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。在mysqllimit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死你的服务器哦。   当一个表数据有几百万的数据的时候成了问题!   如 * from table limit 0,10 这个没有问题 当 limit 200000,10 的时候数据读取就很慢,可以按照...
详解MySQLlimit用法分页查询语句的性能分析
12-16
MySQL中的`LIMIT`子句是执行分页查询的关键工具,允许...综上所述,理解并有效利用`LIMIT`的分页优化技术是数据库管理的关键技能。通过合理的设计和策略,可以确保即使在处理大量数据时,也能保持高效的查询性能
MySQL Limit性能优化分页数据性能优化详解
09-09
以下是对`LIMIT`性能优化分页数据性能优化的详细解释: 首先,理解`LIMIT`的基本语法: ```sql SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset ``` 这里的`offset`是跳过的行数,`rows`是返回的...
Mysql Limit 分页查询优化详解
09-10
本篇文章将深入探讨如何优化使用LIMIT进行分页查询的方法。 首先,让我们回顾LIMIT的基本语法。LIMIT关键字允许我们指定返回结果集的开始位置和结束位置。例如: ```sql SELECT * FROM table LIMIT offset, limit;...
MYSQL分页limit速度太慢的优化方法
12-16
MySQL中,`LIMIT`子句常用于实现分页功能,但当表数据量非常大时,使用`LIMIT`进行分页可能会导致性能急剧下降。这是因为`LIMIT`语句需要扫描大量的行,尤其是在`OFFSET`值较大的情况下。针对这个问题,我们可以...
MySQLlimit 为什么会影响性能?有什么优化方案?
MarkerHub的博客
04-15 116
全新前后端微商城项目,手把手教学!全新前后端微商城项目,手把手教学!全新前后端微商城项目,手把手教学!Limit 是一种常用的分页查询语句,它可以指定返回记录行的偏移量和最大数目。例如,下面的语句表示从 test 表中查询 val 等于4的记录,并返回第300001到第300005条记录:select*fromtestwhereval=4limit300000,5;这样的语句看起来很...
分页offset格式_MySQLlimit分页查询性能问题分析
weixin_39836530的博客
12-10 210
MySQL Limit 语法格式:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset分页查询时,我们会在 LIMIT 后面传两个参数,一个是偏移量(offset),一个是获取的条数(limit)。当偏移量很小时,查询速度很快,但是当 offset 很大时,查询速度就会变慢。测试表:employees_nopartition 数...
mysql分页查询比较
qq_44741568的博客
07-31 194
以下查询适用于id有规律的表,如自增,等差 等 1.普通limit查询 [SQL] SELECT * from tests limit 1000000,100 受影响的行: 0 时间: 0.301ms 2.limit配合子查询 [SQL] SELECT * from tests WHERE id>((SELECT MAX(id) from tests)-200) LIMIT 100 受影响的行: 0 时间: 0.036ms 3.limit已知偏移量 [SQL] SELECT * from te
MySQL分页查询
const_
06-28 1553
rows:记录数 offset:偏移量 SELECT * FROM table LIMIT [offset,] rows SELECT * FROM table LIMIT rows OFFSET offset LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。 LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。(换句话说,LIMIT n 等价于 LIMIT 0,n ) 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。 初始记录行的
不知道哪种分页效果更好?一次性教给你四种分页方案!
芋艿V
12-05 346
???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...
MySQL分页查询自己写
Be_insighted的博客
09-27 1835
MySQL分页查询关键要点 分页查询关键limit、offset,总页数pages、当前页page、每页多少条数据size,总记录数total limit后面的数据为每页多少条数据size; offset为前面所有页数据之和 (page - 1)*size 示例MyBatis Mapper 查询当前页数据 <select id="listByQueryVideoResourceReq4Third" parameterType="string" resultType="ResourceJo
limit简要分析
qq_42135121的博客
08-17 306
limit简要分析 limit分析: 查询分页limit [offset] rows ,offset 是偏移量,rows是需要的数据行数,当偏移量较大时,就会发现limit是从头开始查询到offset+rows,然后舍弃前面的行数返回最后的rows行,这样在小量数据是没有太大问题的,但是在百万或者千万级的数据表中进行查询就会非常吃力, 从上面表可以看出,效率极差,即使经过优化,比如加上 ...
MySQL分页:ROW_NUMBER() vs LIMIT
nbsaas-boot基于Request-Response的企业级快速开发框架
06-01 626
MySQL 中,实现数据分页的方法主要有两种:使用窗口函数和使用LIMIT子句。本文将探讨这两种方法的优劣,帮助您选择最适合您的场景。
mysql limit 大数据_MySQL limit使用方法以及超大分页问题解决
weixin_30118071的博客
01-27 1479
前言日常开发中,我们使用mysql来实现分页功能的时候,总是会用到mysqllimit语法.而怎么使用却很有讲究的,今天来总结一下.limit语法limit语法支持两个参数,offset和limit,前者表示偏移量,后者表示取前limit条数据.例如:## 返回符合条件的前10条语句select * from user limit 10## 返回符合条件的第11-20条数据select * fr...
写文章

热门文章

  • syntax error near unexpected token `(‘ 异常解决 155222
  • java 学生信息管理系统 96786
  • mysql实现ROW_NUMBER() over (PARTITION BY xx ORDER BY ** DESC) 43982
  • 使用springboot时*mapper.xml无法加载的问题 43643
  • Java程序设计中setFont()函数的用法(转) 40486

分类专栏

  • java 147篇
  • 数据湖 5篇
  • hera离线调度开发 10篇
  • Delta Lake 1篇
  • Acm竞赛 234篇
  • 菜鸟android学习之路 49篇
  • Spring框架 16篇
  • ************ACM************
  • 【图论】 48篇
  • 【Dijkstra】 6篇
  • 【拓扑排序】 5篇
  • 【欧拉回路】 2篇
  • 【spfa】 2篇
  • 【强连通图】 3篇
  • 【最小生成树】 4篇
  • 【并查集】 10篇
  • 【0-1分数规划】
  • 【搜索】 59篇
  • 【记忆化搜索】 3篇
  • 【贪心】 25篇
  • 【动态规划】 37篇
  • 【线段树】 15篇
  • 【线段树】【RMQ】 2篇
  • 【哈希表】 1篇
  • 【数据结构】 34篇
  • 【Trie】 4篇
  • 【KMP】 4篇
  • 【二分匹配】 3篇
  • 【字符串】 10篇
  • 【水题】 49篇
  • 【河南省第八届acm程序设计大赛】 6篇
  • ************课程************
  • 【matlab】
  • 【计算机图形学】 3篇
  • 【c++】 1篇
  • 【发发牢骚】 11篇
  • ************JAVAEE************ 4篇
  • 【java】 110篇
  • 【socket】 4篇
  • 【框架】 36篇
  • 【JAVA小游戏】 27篇
  • 【坦克大战】 16篇
  • ***********Android************
  • 【android】 53篇
  • ************心情************
  • 【无聊】 14篇
  • 【服务器】 3篇
  • 【拓展欧几里德】 1篇
  • 【bitset】 1篇
  • 【尺取法】 1篇
  • floyed 1篇
  • 数论 1篇
  • 单调栈 2篇
  • 【数据库】 3篇
  • 【linux】 1篇
  • mysql 1篇
  • 分布式 3篇
  • 异常修复 6篇
  • 设计模式 3篇
  • 大数据 15篇

最新评论

  • 关于dubbo 占位符无法解析问题

    m0_72928278: 太难了,这问题太闹心啦。最后到底热部署 jar 去掉就好了。表情包,感谢,学习大佬 :)

  • spark sql 数据倾斜案例实操

    漫游~: 加了前缀后不需要去掉相关的前缀吗?表情包

  • spark sql 数据倾斜案例实操

    漫游~: 博主您好,TABLESAMPLE (10 PERCENT)随机抽样,是否会有误差?正好错过最大的热点KEY,虽然机率很小

  • hdu1811 Rank of Tetris(拓扑排序+并查集)

    xyw_c: 作者大大 ,我觉得第一步还有出度为0的点大于1, 比如这个样例: 1 > 2 1 > 3 这样也不完整 , 因为没有说2 3 的关系。还请指教!

  • syntax error near unexpected token `(‘ 异常解决

    我意如风: 找了好多文章,这个才是有用,其他的'\',还有"",如果是文件名称还行,但是如果命令本身包含()的就不行了

最新文章

  • 关于如何在 Grafana 绘制 Apache Hudi Metrics 仪表盘的教程
  • 基于Apache Hudi 和 Apache Spark Sql 的近实时数仓架构之宽表建设
  • 基于 Apache Hudi 和 Apache Spark Sql 的近实时数仓架构分享
2023年2篇
2022年4篇
2021年2篇
2020年11篇
2019年16篇
2018年18篇
2017年112篇
2016年246篇
2015年250篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家河南玻璃钢卡通雕塑橘子广西玻璃钢雕塑订制价格江西特色玻璃钢雕塑玻璃钢雕塑摆件酒杯赣州学校玻璃钢雕塑市场平谷玻璃钢花盆山东玻璃钢小羊动物雕塑艺术小品福建园林玻璃钢雕塑采购四川玻璃钢雕塑货源推荐黔西南商场美陈景观蓬安玻璃钢花盆花器玻璃钢雕塑成品价格商场父亲节美陈图片个性化玻璃钢雕塑订做价格玻璃钢艺术雕塑设计公司哪家好苏州玻璃钢广场雕塑唐山小区玻璃钢雕塑定做许昌玻璃钢镂空雕塑制作厂家一般玻璃钢雕塑上什么颜色中卫玻璃钢雕塑制作厂家动物马玻璃钢雕塑河北园林玻璃钢雕塑安装扬州商场新年美陈景观卡通雕塑玻璃钢加工清远玻璃钢雕塑推荐厂家无锡玻璃钢海豚雕塑厂家河南公园景观玻璃钢彩绘雕塑厂玻璃钢花盆菜池子泸州玻璃钢广场雕塑价格植物玻璃钢雕塑施工方案香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化