首页 > 其他分享 >limit 影响性能的原因和优化方案

limit 影响性能的原因和优化方案

时间:2024-01-12 23:23:08浏览次数:30  
标签:性能 查询 索引 limit 100 优化 id select

一、问题

当使用limit实现分页查询时,当limit的偏移量越大时,sql语句的耗时也越大。

select * from table_name limit 10000,10

select * from table_name limit 0,10

这两条查询语句都是取10条数据,但性能就相差甚远。

二、原因

  原因:Limit 会导致 Mysql 扫描过多的数据记录或索引记录,而且大部分扫描到的记录都是无用的。

  客户端程序发送sql语句查询请求给服务层,服务层会解析、优化sql语句,之后交给存储引擎,也就是说,存储引擎是真正完成查询的(增加、删除、修改也是由存储引擎负责的)。

SELECT * FROM testing  limit 1200000,100 

这条SQL 的执行逻辑是:
1)从数据表中读取第N条数据添加到数据集中
2)重复第一步直到 N = 1200000 + 100
3)根据 offset 抛弃前面 1200000 条数
4)返回剩余的 100 条数据

显然,导致这句 SQL 速度慢的问题出现在第2步。这前面的 1200000 条数据完全对本次查询没有意义,但是却占据了绝大部分的查询时间。

当存储引擎查询数据库文件后返回的不是一页的数据(100行), 而是从第1行到第 (1200000 + 100)行的数据一起返回给服务层。服务层收到数据后会抛弃前面的1200000行,只留下最后的100行返回给客户端。

数据库表中行数据、索引都是以文件的形式存储到磁盘(硬盘)上的,而硬盘的速度相对来说要慢很多,存储引擎运行sql语句时,需要访问硬盘查询文件,然后返回数据给服务层。当返回的数据越多时,访问磁盘的次数就越多,就会越耗时。

三、优化

1)可减少返回的字段

2)尽可能使用索引覆盖扫描,避免了回表

select id,val from test where val=4 limit 300000,5;

Mysql 只需要扫描索引页,而不需要访问数据页,提高了查询效率。

3)使用子查询

如果不能使用索引覆盖扫描,或者查询字段较多,可以尝试使用子查询,也就是先用一个子查询找出需要的记录的 id 值,然后再用一个主查询根据 id 值获取其他字段。

比如:

select * from test where id in (select id from test where val=4 limit 300000,5);

Mysql 先执行子查询,在 val 索引上进行范围扫描,并返回 5 个 id 值。然后,Mysql 再执行主查询,在 id 索引上进行点查找,并返回所有字段。这样,Mysql 只需要扫描 5 个数据页,而不是 300005 个数据页,提高了查询效率。

4)使用id限定优化,省去了在数据集中查询初始位置的过程

当表的主键是有序或者是自增,可以使用id限定查询,查询过程是:

当已经查询了某页的数据后,记录下该页最后一行记录的主键id值(本例中是id为主键),查询下一页时就可以使用如下sql: 

 select  *  from testing where 主键列名 > 当前页最后一行的主键值 limit 0, 100 

比如:

当前页最后一行的主键值是1563544,查询下一页就可以使用:

SELECT id,app_type,os_version FROM testing where id>1563566  limit 0,100

第一页怎么查询,可以选择一个比所有主键值都小的值,比如0或者负数 :

SELECT id,app_type,os_version FROM testing where id>0  limit 0,100

5)基于索引再排序

这种方法适用于数据量多的情况(元组数上万),最好ORDER BY后的列对象是主键或唯一索引,使得ORDER BY操作能利用索引被消除但结果集是稳定的。比如下面两个语句:

mysql> show profiles;
+----------+------------+--------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                                        |
+----------+------------+--------------------------------------------------------------------------------------------------------------+
|        8 | 3.30585150 | select * from sbtest1 limit 1000000,10                                                                       |
|        9 | 1.03224725 | select * from sbtest1 order by id limit 1000000,10                                                           |
+----------+------------+--------------------------------------------------------------------------------------------------------------+

对索引字段id使用order by语句后,性能有了明显的提升。

标签:性能,查询,索引,limit,100,优化,id,select
From: https://www.cnblogs.com/beatle-go/p/17961778

相关文章

  • 代码优化
    1.搭建minio2.修改后端文件上传接口  在用户添加service中将avatar的值设置为修改上传接口 3.修改不能修改用户名 在添加用户的index.vue中添加账户绑定disable默认值为false,用来控制修改的不能修改用户名   4.上传文件优化把img的地址改为form.avatar......
  • js中的对象,如果赋值给多个变量,那么会有性能问题吗
    js中的对象,如果赋值给多个变量,那么会有性能问题吗?在JavaScript中,将一个对象赋值给多个变量时,并不会直接导致性能问题。当一个对象被赋值给多个变量时,实际上这些变量都会引用同一个对象,即它们指向内存中的同一块地址。这种行为称为“对象引用”。例如:constobj={a:1,b:2}......
  • 紫光展锐T770安卓核心板_T770核心板性能参数
    展锐T770安卓核心板是一款性能卓越的5G安卓智能模块,采用先进的6nm制程工艺,配备八核(1A76+3A76+4*A55)CPU构架,最高主频可达2.5Ghz,并搭载4.8TOPSNPU计算单元,性能出众。此外,该核心板板载内存单元最高可达8GBRam+256GBROM,支持4KH.265/H.264视频编解码,以及Android13以上操作......
  • MT6785(Helio G95)芯片性能参数_MTK联发科4G处理器
    联发科MT6785平台采用台积电12nmFinFET制程工艺,2*A76+6*A55架构,搭载Android12.0/13.0操作系统,主频最高达2.05GHz,搭载HyperEngine游戏技术,通过四个增强领域的整体增强功能。搭载ArmMali-G76MC4GPU运行速度可提升至900MHz。支持H.264、H.265/HEVC格式视频编码,最高支持4K/......
  • 如何使用人工智能优化 DevOps?
    DevOps和人工智能密不可分,影响着各种业务。DevOps可以加快产品开发速度并简化现有部署的维护,而AI则可以改变整个系统的功能。DevOps团队可以依靠人工智能和机器学习来进行数据集成、测试、评估和发布系统。更重要的是,人工智能和机器学习可以以高效、快速、安全的方式改进DevOp......
  • 优化 Odoo 性能:方法级别缓存的魔力
    浅谈Odoo的 @ormcache 装饰器。1.缓存的背景在实际开发中,某些计算可能会消耗大量时间和资源。例如,在计算字段的值时,可能需要执行复杂的逻辑或查询大量数据。为了避免在相同参数下重复执行这些耗时的计算,我们可以使用缓存机制。2.使用@ormcache装饰器在Odoo中,@ormcache ......
  • 在CentOS中,对静态HTTP服务的性能监控
    在CentOS中,对静态HTTP服务的性能监控和日志管理是确保系统稳定运行和及时发现潜在问题的关键。以下是对这一主题的详细探讨。性能监控1. 使用工具监控:top、htop、vmstat、iostat等工具可以用来监控CPU、内存、磁盘I/O等关键性能指标。这些工具可以实时显示系统资源的使用情况,帮助......
  • 电源模块有哪些性能指标 boshida 稳定可靠 高效能转化
    电源模块有哪些性能指标boshida稳定可靠高效能转化电源模块的性能指标可以分为以下几个方面:输入电压范围:指模块能够正常工作的输入电压范围,一般以最小和最大输入电压值进行描述。输出电压精度:指模块输出电压与设定值之间的差异程度,精度越高,输出电压与设定值的差异越小。输出......
  • 好性能成就“珍·鲜”品质 浪潮信息SAP HANA一体机助力越秀辉山数字进阶
    如何通过数字技术,实现从牧场到工厂再到终端零售的数据驱动和全流程覆盖管理,是现代乳企抢抓新一轮科技革命和产业变革机遇的必然选择。其中,作为拥有72年历史,东北土生土长的乳企品牌,辉山乳业秉持着“至珍致爱品质如山”的品牌理念,不仅用新鲜的乳品哺育一代又一代人成长,更紧握数字化......
  • 大屏显示性能问题
      大屏显示的定位就是在可视化大屏中显示数据和图表,大屏有可能会晚上关机早上开机,也可能一直在运转。时间一久,会导致页面卡顿,页面渲染不流畅,影响用户体验。  1、大屏可能会循环显示成千上万条数据,甚至更多,如果将大批量的数据全部一次性加载轮播,肯定会造成内存占用过多,服......