MySQL 查询 limit 100000000, 10 和 limit 10 速度一样快吗?

MySQL 查询 limit 100000000, 10 和 limit 10 速度一样快吗?

在这里插入图片描述

MySQL内部分为server层存储引擎层。一般情况下存储引擎都用innodb。

server层有很多模块,其中需要关注的是执行器是用于跟存储引擎打交道的组件。

执行器可以通过调用存储引擎提供的接口,将一行行数据取出,当这些数据完全符合要求(比如满足其他where条件),则会放到结果集中,最后返回给调用mysql的客户端

两种查询方式。对应 limit offset, size 和 limit size 两种方式。

而其实 limit size ,相当于 limit 0, size。也就是从0开始取size条数据。

也就是说,两种方式的区别在于offset是否为0。

1. 以主键索引的 LIMIT 10 为例

LIMIT 10 查询的是结果集的前 10 行数据。这种情况下,MySQL 只需要扫描并返回前 10 行数据,操作相对简单且快速。

SELECT * FROM table_name LIMIT 10;

server层会调用innodb的接口,在innodb里的主键索引中获取到第0到10条完整行数据,依次返回给server层,并放到server层的结果集中,返回给客户端。

2. 以主键索引的 LIMIT 100000000, 10 为例

LIMIT 100000000, 10 查询的是从结果集的第 100000001 行开始的 10 行数据。这种情况下,MySQL 需要先扫描前 100000000 行数据并丢弃,然后再返回接下来的 10 行数据。这种操作会导致大量的行扫描和丢弃操作,效率很低。

SELECT * FROM table_name LIMIT 100000000, 10;

server层会调用innodb的接口,由于这次的offset=100000000,会在innodb里的主键索引中获取到第0到(100000000+ 10)条完整行数据,返回给server层之后根据offset的值挨个抛弃,最后只留下最后面的size条,也就是10条数据,放到server层的结果集中,返回给客户端。

可以看出,当offset非0时,server层会从引擎层获取到很多无用的数据,而获取的这些无用数据都是要耗时的。

以非主键索引的 LIMIT 10 为例

SELECT * FROM table_name LIMIT 10;

server层会调用innodb的接口,在innodb里的非主键索引中获取到第0条数据对应的主键id后,回表到主键索引中找到对应的完整行数据,然后返回给server层,server层将其放到结果集中,返回给客户端。

而当offset>0时,且offset的值较小时,逻辑也类似,区别在于,offset>0时会丢弃前面的offset条数据。

也就是说非主键索引的limit过程,比主键索引的limit过程,多了个回表的消耗。

但当offset变得非常大时,比如600万,此时执行explain。

可以看到type那一栏显示的是ALL,也就是全表扫描

这是因为server层的优化器,会在执行器执行sql语句前,判断下哪种执行计划的代价更小。

很明显,优化器在看到非主键索引的600w次回表之后,摇了摇头,还不如全表一条条记录去判断算了,于是选择了全表扫描。

因此,当limit offset过大时,非主键索引查询非常容易变成全表扫描。是真性能杀手

性能比较

  • LIMIT 10:MySQL 只需扫描前 10 行数据,快速返回结果,性能高。
  • LIMIT 100000000, 10:MySQL 需要扫描前 100000000 行数据并丢弃,然后返回接下来的 10 行数据,性能低。

优化大偏移量的查询

当你需要从一个大偏移量开始查询时,可以采用以下优化方法:

1. 使用覆盖索引

确保查询使用了覆盖索引,这样可以减少全表扫描的开销。

SELECT col1, col2 FROM table_name FORCE INDEX (index_name) WHERE indexed_column >= value LIMIT 100000000, 10;
2. 通过主键范围查询

使用主键范围查询,先查找主键值,再根据主键值进行查询,避免大偏移量的扫描。

第一步:找到起始主键值
SELECT id FROM table_name ORDER BY id LIMIT 100000000, 1;-- 假设起始主键值为 start_id
-- 第二步:基于主键值进行查询
SELECT * FROM table_name WHERE id >= start_id LIMIT 10;
3. 使用延迟关联(Deferred Join)

先根据索引字段查找主键,再根据主键进行关联查询,从而避免大偏移量的扫描。

-- 第一步:查找主键值
SELECT id FROM table_name ORDER BY id LIMIT 100000000, 10;-- 第二步:基于主键进行关联查询
SELECT * FROM table_name WHERE id IN (id1, id2, ..., id10);
4. 使用分页技术

对于用户分页的场景,通常需要记录当前页和页数,采用基于主键或其他唯一标识的分页技术,避免使用 LIMIT 大偏移量查询。

结论

MySQL 中 LIMIT 100000000, 10LIMIT 10 的查询速度并不一样。大偏移量的查询会导致性能问题,可以通过覆盖索引、主键范围查询、延迟关联等方法进行优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3268196.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer-Bert---散装知识点---mlm,nsp,较之经典tran的区别和实际应用方式

本文记录的是笔者在了解了transformer结构后嗑bert中记录的一些散装知识点,有时间就会整理收录,希望最后能把transformer一个系列都完整的更新进去。 1.自监督学习 bert与原始的transformer不同,bert是使用大量无标签的数据进行预训练&#…

LINUX 孤儿进程和僵尸进程

1、孤儿进 一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作 为了释放子进程的占用的系统资源: 进程结束之后&#xf…

意象万千的紫

文章目录 引言中国紫梦幻紫莫奈紫引言 2024巴黎奥运会的临近,很多网友都被“法式浪漫奥运紫”惊艳了,大到赛场跑道,小到一个羽毛球的设计,紫色的嵌入使竞技体育增添了不少梦幻的感觉。 中国紫 清代: 陈曾寿 【 雪青衫子绮罗新,一晌当前色相真】 青莲 五代十国李璟 “青…

mysql数据库管理(2)

数据库增删改查 将sql文件传到Linux /home目录下面 mysql –uroot –p create database test; use test; source myemployees.sql(如果在home目录下,直接source .sql) show tables; select * from departments; ps:SQL 语言大小写…

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

《动手做科研 》| 01.AI的最新进展与科研应用

地址链接:《动手做科研》01. AI的最新进展与科研应用 导读: 该部分介绍AI的最新进展以及在科研各个领域的应用 目前AI发展到什么程度了&#xff1f;哪些问题可以尝试用AI解决呢&#xff1f;如何快速构建一个属于自己的AI应用程序&#xff1f; 本教程目标&#xff1a; 与语言模…

【C++笔试强训】day01

数字统计 思路 用%10取出个位的数字&#xff0c;用/10迭代。 代码 #include <iostream> using namespace std;int main() {int l, r, res 0;cin >> l >> r;for (int i l; i < r; i){int x i;while (x){if (x % 10 2) res;x / 10;}}cout << r…

GPT-4O 的实时语音对话功能在处理多语言客户时有哪些优势?

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 我瞄了一眼OpenAI春季发布会&#xff0c;这个发布会只有26分钟&#xff0c;你可以说它是一部科幻短片&#xff0c;也可以说它过于“夸夸其谈”&#xff01;关于…

计算机网络实验-RIP配置与分析

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 路由信息协议&#xff08;Routing Information Protocol&#xff0c;RIP&#xff09;是一种基于距离向量&#xff08;Distance-Vector&…

推荐3款将相片变为动漫风格的免费AI工具推荐

toonme ToonMe是一款功能强大的在线和移动端应用&#xff0c;专门用于将照片转换成卡通风格图像。该工具利用先进的AI技术&#xff0c;能够快速识别照片中的面部特征&#xff0c;并进行智能处理&#xff0c;生成高清晰度的卡通肖像。 功能特点 ToonMe通过其内置的人工智能算法…

【STL之·容器·queue】

系列文章目录 文章目录 前言一、概述1.1 特点&#xff1a;1.2 queue的工作原理和内部实现 二、基本操作三、性能分析3.1 STL队列的时间复杂度和空间复杂度3.2 STL队列和自定义队列的性能差异 四、实例演示总结 前言 常见的应用场景包括&#xff1a; 任务调度&#xff1a; 队列可…

Dav_笔记11:SQL Tuning Overview-sql调优 之 5

构建SQL测试用例 对于许多与SQL相关的问题&#xff0c;获得可重现的测试用例可以更轻松地解决问题。从11g第2版&#xff08;11.2&#xff09;开始&#xff0c;Oracle数据库包含SQL测试用例构建器&#xff0c;它可以自动完成收集和复制尽可能多的有关问题及其发生环境的信息的难…

CIT分布式版本控制系统

一、GIT概述 在Linux虚拟机中配置DNS主从&#xff08;Master-Slave&#xff09;服务&#xff0c;通常涉及到BIND&#xff08;Berkeley Internet Name Domain&#xff09;软件的安装、主服务器&#xff08;Master&#xff09;的配置以及从服务器&#xff08;Slave&#xff09;的…

MFC开发,自定义消息

在MFC开发中&#xff0c;主要核心机制就是消息机制。QT与之类似的机制就是信号与槽。QT中的信号与槽是非常容易自定义的&#xff0c;MFC也是如此&#xff0c;自定义也是比较方便&#xff0c;况且自定义消息或者控件在整个GUI图形化界面开发中也是非常重要的部分&#xff0c;上篇…

【python】python销售数据分析可视化(源码+论文+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

记忆、思维、问题解决与创造、想象

记忆 思维 问题解决与创造性 想象

食家巷一窝丝:丝丝入味,口口留香

在美食的大观园中&#xff0c;有一种独特的美味让人难以忘怀&#xff0c;那就是食家巷一窝丝。食家巷一窝丝&#xff0c;以其精湛的制作工艺和独特的口感&#xff0c;成为了众多美食爱好者的心头好。 当你第一眼看到一窝丝&#xff0c;定会被它那精致的外形所吸引。纤细如丝的面…

nodejs - express 学习笔记

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架&#xff0c;官方网址&#xff1a;https://www.expressjs. com.cn/ 简单来说&#xff0c;express 是一个封装好的工具包&#xff0c;封装了很多功能&#xff0c;便于我们开发 WEB 应用&#xff08;HTTP 服务&am…

如何恢复最近删除的文件?5种简单方法!

数据丢失在我们的工作生活中经常发生。当你决定清理硬盘或U盘时&#xff0c;你会删除一些文件夹或文件。如果你通过右键单击删除文件&#xff0c;则可以很容易从回收站恢复已删除的文件。但是&#xff0c;如果你按Shift Delete键、清空回收站或删除大于8998MB的大文件夹&#…

哪些ESP32系列芯片具有双道通I2S和PDM RX?

ESP32芯片选择&#xff1a; 需要使用2个通道IIS的&#xff0c;只能选择ESP32、ESP32-S3、ESP32-P4三种之一&#xff0c;需要适应PDM RX时也只能选择这3个芯片系列。 芯片I2S 标准PDM TXPDM RXTDMADC/DACLCD/摄像头ESP32I2S 0/1I2S 0I2S 0无I2S 0I2S 0ESP32-S2I2S 0无无无无I2…