当前位置: 首页 > article >正文

【编程底层原理】亿级数据表查询最后10条记录limit 99999990,10性能为啥特慢,而且数据库都被查宕机了

一、影响因素

查询一个包含1亿条数据的表,并使用 LIMIT 99999990, 10 来获取最后的10条记录,性能慢的原因主要是因为 LIMIT 子句的偏移量(offset)非常大。以下是一些导致性能问题的关键因素

  1. 大量跳过 - LIMIT 子句的前一个数字(99999990)是告诉数据库跳过前99999990条记录,这需要数据库扫描并跳过这些记录才能返回最后的10条。
  2. 全表扫描 - 如果没有有效的索引来支持这种类型的查询,数据库可能需要执行全表扫描,这在数据量大的情况下非常耗时。
  3. 排序开销 - 如果查询中包含 ORDER BY 子句,并且排序的列没有索引,数据库需要对所有记录进行排序,这会增加大量的CPU和内存开销。
  4. 临时表空间 - 排序操作可能需要使用临时表空间,对于大量数据,这可能会消耗大量的磁盘I/O资源。
  5. 锁定和闩锁 - 大量的跳过和扫描可能导致数据库锁定和闩锁,影响并发性能,甚至导致其他查询和更新操作被阻塞。
  6. 资源耗尽 - 如果数据库服务器的硬件资源(如CPU、内存、I/O)有限,这种类型的查询可能会消耗大量资源,导致服务器响应缓慢或宕机。

二、优化措施

为了避免这些问题,可以采取以下优化措施- 使用索引 - 确保有一个索引可以快速定位到接近表末尾的位置。例如,如果有一个时间戳或自增ID列,可以在这个列上创建索引。

  • 优化查询 - 如果可能,重写查询逻辑,避免使用大偏移量。如果需要获取最后10条记录,考虑使用其他逻辑来确定这10条记录的位置。
  • 分批处理 - 如果需要处理大量数据,考虑使用分批查询和处理的方法,每次处理一小部分数据。
  • 资源优化 - 根据服务器的硬件配置优化数据库的配置,如增加内存分配,优化I/O性能等。
  • 分布式查询 - 对于非常大的表,考虑使用分区表或分布式数据库系统,以提高查询性能。
  • 监控和调优 - 使用数据库的性能监控工具来识别瓶颈,并根据需要进行调优。
  • 避免大偏移量 - 如果业务逻辑允许,避免使用带有大偏移量的 LIMIT 子句,因为这通常是一个性能杀手。
    在某些情况下,如果表的结构和数据分布允许,可以通过其他方法来获取最后几条记录,例如,如果有一个自增ID,可以先获取最大ID,然后查询紧随其后的记录。

http://www.kler.cn/a/308069.html

相关文章:

  • conda创建 、查看、 激活、删除 python 虚拟环境
  • MyBatis——增删查改(XML 方式)
  • 【IC每日一题:IC常用模块--RR/handshake/gray2bin】
  • 时序论文20|ICLR20 可解释时间序列预测N-BEATS
  • Java算法OJ(7)随机快速排序
  • 新版 idea 编写 idea 插件时,启动出现 ClassNotFound
  • C语言中数据类型
  • PHP:强大的Web开发语言
  • nginx实现https安全访问的详细配置过程
  • Spring Boot-RESTful API相关问题
  • 开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择
  • 海外云手机怎么实现TikTok多账号防关联?
  • 【iOS逆向与安全】frida-trace命令大全
  • AI 时代程序员的应变之道
  • 数据分析-25-时间序列预测之基于keras的LSTM+注意力机制预测风速
  • MySQL —— 视图
  • Serverless 安全新杀器:云安全中心护航容器安全
  • 图神经网络模型扩展5--3
  • 完全背包问题(优化版二维)
  • 在 Red Hat 上安装 SQL Server 2022 并创建数据库
  • Java代码实现Httpclient调用-验证码登录拦截获取到列表数据写入数据库
  • 昇腾服务器(Atlas800系列)部署embedding和rerank模型
  • USBCANFD卡再汽车电子行业中得应用
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(三十二)
  • python学习第十节:爬虫基于requests库的方法
  • python开发目录扫描工具