我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySql深度分页慢sql原因

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySql深度分页慢sql原因

先说解决方案:索引排序+索引覆盖+延迟关联。

比如查询语句如下:

select * from user order by  createTime limit 500000, 10;

 延迟关联,即先查主键 id,然后根据 id 查其它字段:

select * from user u,(select id from user order by createTime  limit 500000, 10) t where u.id=t.id;

 详细原理如下:

随着 mysql limit 的值越来越大,查询可能慢,比如:

select * from user order by createTime  limit 500000 , 10;

慢的真正原因,不是因为扫描了 500000 行,而在于把这 500000 行数据重新排序。

explain 如下:

 可以看到 Extra 是 Using filesort,表示外部排序,

 索引有两个功能:查找和排序。

大家一般对索引的查找功能比较了解,却忽视了索引的排序功能,索引中的数据是已经排好序的,如果从索引中拿到的数据顺序跟我们需要排序的顺序是一致的,那就不要重新排序了。

怎么解决 Using filesort 呢?答案是给order by 后面列使用索引; 

select * from user order by  id limit 500000, 10;  --270ms


 延迟关联:

延迟关联就是指先拿到主键 id,然后再根据 id 查询 select *

select id from user order by id limit 500000, 10;

 Extra 的中 Using index 就表示“覆盖索引”,表示整个查询过程仅读取了索引中的数据而没有回表查询。

合并在一个 sql 语句中:

select * from user u,(select id from user order by id limit 500000, 10)  t where u.id=t.id; --83ms


索引覆盖:

mysql B+树索引:

  mysql 的主键索引叶字节点存的是主键所对应行的整行的全量数据

使用索引覆盖后查询:

select * from user order by id limit 500000, 10;  --305ms  all

select id from user order by id limit 500000, 10;  --99ms   index

重排序查询:

select * from user order by id limit 500000, 10;  --305ms  all

select * from user order by createTime limit 500000, 10;  --999ms  all filesort

 可以发现在50w条数据时, 即使是全表扫描, 0.3s, 索引覆盖0.1s

如果使用非索引字段排序, 则0.9s


总结: 

mysql深度分页问题的根因,不是因为扫描了大量数据,而是大量数据的重新排序太耗时,只要不重排序,就算扫描了大量数据,也不会有性能问题。

来源地址:https://blog.csdn.net/xiaoshitou_2015/article/details/130027651

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySql深度分页慢sql原因

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 查询速度慢的原因

目录一、慢在哪?二、是否查询了不需要的数据1. 查询不需要的记录2. 多表关联时返回全部列3. 总是查询出全部列4. 重复查询相同的数据三、是否扫描了额外的记录1. 响应时间2. 扫描的行数和返回的行数3. 扫描的行数和访问类型谈到MySQ
2022-06-01

MySQL深分页问题的原因及解决方案

目录前言第一部分:深分页问题的背景和影响什么是深分页?深分页的影响实际场景中的问题第二部分:mysql 索引结构和查询执行流程MySQL 索引概述查询执行流程深分页查询的问题案例分析第三部分:深分页性能下降的原因1. 索引扫描的局限性2.
MySQL深分页问题的原因及解决方案
2024-09-29

云服务器速度慢的原因分析

云服务器是一种虚拟的存储和计算服务,它可以在不同的设备上运行,但是速度慢是其中很常见的一个问题。以下是一些可能导致云服务器速度变慢的原因:网络连接问题:有时云服务器上的数据传输速度可能比预期慢。这可能是因为连接不稳定或网络拥堵,导致延迟增加。数据量大:当你的数据包太多,超过了云服务器的处理能力时,它的处理速度可能会变慢。这可能是因为服务器过载或数据包处理过程中的错误等其他问题。操作系统问
2023-10-26

MySQL limit分页大偏移量慢的原因及优化方案

在 MySQL 中通常我们使用 limit 来完成页面上的分页功能,但是当数据量达到一个很大的值之后,越往后翻页,接口的响应速度就越慢。 本文主要讨论 limit 分页大偏移量慢的原因及优化方案,为了模拟这种情况,下面首先介绍表结构和执行的
2022-05-19

云服务器速度慢的原因分析报告

云服务器是近年来最流行的云计算服务之一,其速度慢的原因可能有很多,以下是一些常见的原因:配置问题:云服务器需要依赖虚拟化技术,在配置上存在差异。如果虚拟化配置不当,服务器的配置文件可能会变得不一致,从而导致服务器性能变慢。此外,云服务器通常使用多个虚拟服务器进行部署,这也可能导致服务器性能变慢。网络问题:如果云服务器需
云服务器速度慢的原因分析报告
2023-10-27

Java锁竞争导致sql慢日志原因分析

这篇文章主要介绍了Java锁竞争导致sql慢的日志原因分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2022-11-21

MySQL调优之SQL查询深度分页问题怎么解决

这篇文章主要讲解了“MySQL调优之SQL查询深度分页问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL调优之SQL查询深度分页问题怎么解决”吧!一、问题引入例如当前存在一
2023-07-05

总结12个MySQL慢查询的原因分析

这篇文章主要介绍了总结12个MySQL慢查询的原因分析,慢查询,都是因为没有加索引。如果没有加索引的话,会导致全表扫描的,更多相关内容需要的朋友可以参考一下
2022-11-13

如何解决mysql深度分页问题

目录mysql深度分页问题1.基本分页:耗时0.019秒2.深度分页:耗时10.236秒3.深度ID分页:耗时0.052秒4.两步走深度分页:耗时0.049秒+0.017秒5.一步走深度分页:耗时0.05秒6.集成BeanSearcher框
2023-01-09

Mysql深度分页搜索怎么优化

要优化MySQL深度分页搜索,可以考虑以下几种方法:使用索引:确保搜索的字段上有适当的索引。对于深度分页搜索,较大的表可能需要创建复合索引,以提高查询性能。限制返回的列:只选择需要的列,而不是返回整行数据。这可以减少数据传输量,提高查询速度
Mysql深度分页搜索怎么优化
2023-10-28

MySQL深度分页(千万级数据量如何快速分页)

目录前言案例优化小结前言 后端开发中为了防止一次性加载太多数据导致内存、磁盘IO都开销过大,经常需要分页展示,这个时候就需要用到MySQL的LIMIT关键字。但你以为LIMIT分页就万事大吉了么,Too young,too simple啊,
2022-05-20

编程热搜

目录