Mysql--实战篇--大数据量表的分页优化(自增长主键,子查询主键主查询全部,查询条件加索引,覆盖索引等)

news2025/1/18 4:44:21

当Mysql数据表存储大量数据时(百万级别数据),分页查询的性能问题是一个常见的挑战。特别是当使用LIMIT和OFFSET时,随着OFFSET的增加,查询性能会显著下降。原因在于MySQL需要扫描并跳过前面的行,这会导致I/O操作和CPU使用率增加。
OFFSET是导致分页查询变慢的主要原因之一。随着OFFSET的增大,MySQL需要扫描并跳过越来越多的行,这会导致查询时间线性增长。因此,应该尽量避免使用OFFSET。

1、索引优化

对于大数据量的分页查询,建议使用表的主键(如id)或唯一列来进行分页。通过这种方式,MySQL可以直接从指定的记录开始读取,而不需要扫描和跳过前面的行。
这就要求主键列或者唯一的列不为空,且是连续的整数最合适。

示例:
假设我们有一个orders表,包含大量订单数据。我们希望每次返回10条记录,并且从上次查询的结果之后继续获取下一页的数据。
sql示例:

-- 第一次查询(获取第 1-10 条记录)
SELECT order_id, order_date, amount 
FROM orders 
WHERE user_id = 123 
ORDER BY order_id 
LIMIT 10;

-- 下一页查询(从上次查询的最大order_id开始)
SELECT order_id, order_date, amount 
FROM orders 
WHERE user_id = 123 
AND order_id > 1000  -- 假设上一页的最大order_id是1000
ORDER BY order_id 
LIMIT 10;

优点:

  • 高效:MySQL可以直接从指定的order_id开始读取,而不需要扫描和跳过前面的行。
  • 可扩展:即使数据量非常大,查询性能也不会随着页码的增加而显著下降。

注意事项:

  • 确保order_id列上有索引,以便查询能够快速定位到指定的记录。
  • 如果order_id不是唯一的,或者有重复值,可以考虑使用复合条件(如order_id和created_at)来确保唯一性。

2、覆盖索引

覆盖索引是指索引中包含了查询所需的所有列,这样查询可以直接从索引中获取数据,而不需要访问表的数据页。对于分页查询,覆盖索引可以显著减少I/O操作,提升查询性能。

示例:
假设我们经常对orders表进行分页查询,并且每次都查询order_id、order_date和amount列。我们可以在这些列上创建一个组合索引。
sql示例:

CREATE INDEX idx_order_id_date_amount ON orders (order_id, order_date, amount);

优点:

  • 减少I/O操作:查询可以直接从索引中获取所有需要的数据,而不需要访问表的数据页。
  • 提高查询速度:覆盖索引可以显著加快分页查询的速度,尤其是在数据量较大的情况下。

3、延迟关联(Deferred Join)

对于多表联合查询,先查询主键集合,再根据主键查询完整数据。

sql示例:

第一步:
select id from articles order by id limit 100000, 10;
第二步:
select * from articles where id in (主键集合);

优点:
减少数据扫描量,适用于多表复杂查询。仅查询id不会回表查询,性能相对很快。

缺点:
需要多次查询。

4、伪分页

当翻页至极深处时,可以限制查询范围,提示用户返回首页或前几页。

sql示例:

select * from articles order by id limit 1000;

优点:
用户体验较好,避免性能瓶颈。

缺点:
牺牲极深分页的需求。

5、最终优化方案

(1)、自增长主键

mysql推荐使用自增id作为数据表的主键,不要使用uuid作为数据表的主键。使用uuid作为主键不仅会带来性能上的问题,在查询时也会遇到问题。因为在使用select id from table limit 10000,10 查询id数据时,默认是对id进行排序,返回的是排序后的id结果,如果我们想按插入顺序查询结果,这样查询出来的结果就与我们的需求不相符。
Mysql表的数据行是按照聚簇索引(通常是主键)的顺序存储。uuid则是无序的会增加查询和插入数据的消耗。

(2)、覆盖索引

仅返回查询必要的字段,如果字段少的话,可以创建组合索引实现覆盖索引的效果,避免回表查询。

(3)、子查询

使用子查询仅查询需要的主键id,在对目标id进行查询必要的字段。

select id,title from collect where id>=(select id from collect order by id limit 90000,1) limit 10;
(4)、包含方法的优化

对于查询中包含统计函数的方法,性能上从高到低count()≈count(1)>count(id)>count(field),因为mysql()做过优化,会自动选择成本最小的方式查询,前提是只有在Mysql5.6之后的版本才有优化。

综上所述,在查询条件的列上添加索引,自增长主键和子查询的方式是优化大数量表分页查询慢问题的必选方案。如果返回的数量列较少,可以考虑使用覆盖索引进行优化。如果查询包含方法,可以考虑多个方法之间性能的问题作出最优的选择。

乘风破浪会有时,直挂云帆济沧海!!!

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

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

相关文章

Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统基础系列(四)

文章目录 概要1 Realsense相机驱动安装Method1: 使用Intel服务器预编译包Method2: 使用ROS服务器预编译包Method3: 使用SDK源代码方法对比总结 2 Realsense-ROS通讯配置与使用2.1 Realsense-ROS包安装2.2 ROS节点启动 小结Reference 概要 本文首先阐述了Realsense相机驱动安装…

vscode配置opencv4.8环境

1 安装cmake 下载链接如下https://github.com/Kitware/CMake/releases/download/v3.27.7/cmake-3.27.7-windows-x86_64.zip 解压后放到指定目录后,添加bin目录到环境变量即可。 2 mingw安装 下载链接如下(下图的x86_64-posix-sjlj): Download x86_6…

软件测试 —— Selenium(等待)

软件测试 —— Selenium(等待) 一个例子强制等待使用示例:为什么不推荐使用强制等待?更好的选择 隐式等待 implicitly_wait()隐式等待和强制等待的区别隐式等待(Implicit Wait)强制等…

自动化之Ansible

一、Ansible介绍 Ansible是一个同时管理多个远程主机的软件(任何可以通过SSH协议登录的机器),因此Ansible可以管理 运程虚拟机、物理机,也可以是本地主机(linux、windows)。 Ansible通过SSH协议实现 管理节点、远程节点的通信。 只要是能够SSH登录的主机…

算法(蓝桥杯)贪心算法4——拦截导弹的系统数量求解

题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 假设某天雷达捕捉到敌国的导弹来袭。由于该系统还在试用…

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些? 答案:Java中的基本数据类型包括整数类型(byte、short、int、long)、浮点类型(float、double)、字符类型(char)和布尔类型(boo…

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…

Golang笔记——协程同步

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的协程同步的实现和应用场景。 文章目录 协程同步是什么?为什么需要协程同步?常见的协程同步机制互斥锁&#xff0…

Visual Studio Community 2022(VS2022)安装方法

废话不多说直接上图: 直接上步骤: 1,首先可以下载安装一个Visual Studio安装器,叫做Visual Studio installer。这个安装文件很小,很快就安装完成了。 2,打开Visual Studio installer 小软件 3&#xff0c…

目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析

目录 引言 YOLO系列 网络结构 多尺度检测 损失函数 关键特性 SSD 锚框设计 损失函数 关键特性 Faster R-CNN 区域建议网络(RPN) 两阶段检测器 损失函数 差异分析 共同特点 基于深度学习 目标框预测 损失函数优化 支持多类别检测 应…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器: 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu?” q&a🔗:https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

发送dubbo接口

史上最强,Jmeter接口测试-dubbo接口实战(超级详细)_jmeter调用dubbo接口-CSDN博客 干货分享:Dubbo接口及测试总结~ 谁说dubbo接口只能Java调用,我用Python也能轻松搞定 telnet xxx.xxx.xxx.xxx 端口号 再回车显示dub…

Leetcode 91. 解码方法 动态规划

原题链接&#xff1a;Leetcode 91. 解码方法 自己写的代码&#xff1a; class Solution { public:int numDecodings(string s) {int ns.size();vector<int> dp(n,1);if(s[n-1]0) dp[n-1]0;for(int in-2;i>0;i--){if(s[i]!0){string ts.substr(i,2);int tmpatoi(t.c…

SpringBoot源码解析(七):应用上下文结构体系

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args Sp…

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现 目录 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长…

XML在线格式化 - 加菲工具

XML在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果

树莓派5--系统问题汇总

前言&#xff1a; 该文章是我在使用树莓派5时所遇到的问题以及解决方案&#xff0c;希望对遇到相同问题的能够有所帮助。我的树莓派系统版本为&#xff1a;Pi-OS-ROS_2024_09_29 注意&#xff1a;如果没有什么需求千万不要更新树莓派中任何软件或者系统&#xff0c;除非你真的…

C#学习笔记 --- 基础补充

1.operator 运算符重载&#xff1a;使自定义类可以当做操作数一样进行使用。规则自己定。 2.partial 分部类&#xff1a; 同名方法写在不同位置&#xff0c;可以当成一个类使用。 3.索引器&#xff1a;使自定义类可以像数组一样通过索引值 访问到对应的数据。 4.params 数…

【2024年华为OD机试】 (C卷,100分)- 免单统计(Java JS PythonC/C++)

一、问题描述 题目描述 华为商城举办了一个促销活动&#xff0c;如果某顾客是某一秒内最早时刻下单的顾客&#xff08;可能是多个人&#xff09;&#xff0c;则可以获取免单。 请你编程计算有多少顾客可以获取免单。 输入描述 输入为 n 行数据&#xff0c;每一行表示一位顾…

python中数据可视化库(Matplotlib)

python中数据可视化库&#xff08;Matplotlib&#xff09; 安装 Matplotlib基本使用绘图类型示例散点图 (Scatter Plot)柱状图 (Bar Chart)饼图 (Pie Chart)直方图 (Histogram) 自定义图表样式多面板图表 (Subplots)3D 图表 Matplotlib 是 Python 中一个非常流行的绘图库&#…