MySQL:MySQL中 limit 1000000,10 为什么慢?如何优化?

news/2024/9/29 6:08:30 标签: mysql, 数据库

一、前言

  在 MySQL 中,使用 LIMIT X, Y 语句时,如果 X 的值很大,查询性能确实可能会受到影响。这是因为 MySQL 需要先扫描或处理前 X 条记录,然后才能返回从第 X+1 条开始的 Y 条记录。当 X 很大时,这个扫描过程会消耗大量的时间和资源。

  这个问题呢其实就是 MySQL 中典型的深度分页问题。那么我们在日常开发过程中,如何优化呢?

二、案例分析

例如以下示例

  limit 0,10:查询时间大概在 20 毫秒左右。

  limit 1000000,10:查询时间可能是 15 秒左右(1秒等于 1000 毫秒),甚至更长时间。

  所以,可以看出,limit 中 X 值越大,那么查询速度都越慢。

原因分析

1. 大量数据扫描

  MySQL 需要扫描大量的数据行(在这个例子中是前100万行),才能定位到需要返回的数据。这个过程中,MySQL 可能会执行全表扫描或全索引扫描,尤其是在没有合适索引支持的情况下。

2. 回表查询

  如果查询涉及非主键索引,MySQL 可能需要先通过非主键索引找到对应的主键ID,然后再通过主键索引回表查询实际数据,这称为“回表”。对于大量数据的查询,回表次数也会显著增加,影响查询性能。

三、优化方法

日常开发中,常用的优化方法

1. ID定位法

  使用上一页最后一条记录的ID(或其他唯一标识符)作为下一页查询的起点。这种方法避免了使用 LIMIT 的 offset 部分

  假设你有一个包含大量记录的表 order,并且你想获取第 10000 页的数据,每页 10 条记录。

传统的查询可能是这样的:

SELECT * FROM orders ORDER BY id LIMIT 99990, 10;
使用ID定位法

SELECT * FROM orders WHERE id > LAST_SEEN_ID ORDER BY id LIMIT 10;

2. 利用子查询或延迟关联优化

SELECT a.*   
FROM ORDER a  
INNER JOIN (  
    SELECT id FROM ORDER WHERE 条件 ORDER BY id LIMIT 1000000, 10  
) b ON a.id = b.id;

3. 索引优化添加适当的索引

  为查询中涉及的列创建索引,特别是 WHERE 子句和 ORDER BY 子句中的列。确保索引的选择是合理的,避免创建过多或不必要的索引。

  使用覆盖索引:如果查询的列都包含在索引中,那么可以直接从索引中获取数据,而无需回表查询,这样可以显著提高查询性能。

4. 使用缓存查询缓存

  对于频繁查询但数据变化不大的结果,可以使用缓存机制,将查询结果缓存起来,减少对数据库的直接访问。但是,需要注意缓存策略和数据变动情况,避免数据不一致问题。

  分页缓存:如果查询的数据经常被访问,可以将查询结果缓存在应用程序中,避免每次都进行数据库查询。

四、总结

  limit 1000000, 10 查询慢的问题主要是由于需要扫描大量数据导致的。通过索引优化、分页查询优化、查询语句调整、使用缓存、等措施,可以显著提高查询性能。在实际应用中,需要根据具体的业务需求和数据特点,选择合适的优化方法,并进行测试和评估,以确定最佳的优化策略。


http://www.niftyadmin.cn/n/5682532.html

相关文章

【STM32】RTT-Studio中HAL库开发教程七:IIC通信--EEPROM存储器FM24C04

文章目录 一、简介二、模拟IIC时序三、读写流程四、完整代码五、测试验证 一、简介 FM24C04D,4K串行EEPROM:内部32页,每个16字节,4K需要一个11位的数据字地址进行随机字寻址。FM24C04D提供4096位串行电可擦除和可编程只读存储器&a…

使用 vite 快速初始化 shadcn-vue 项目

Vite 1. 创建项目 使用 vite 创建一个新的 vue 项目。 如果你正在使用 JS 模板,需要存在 jsconfig.json 文件才能正确运行 CLI。 # npm 6.x npm create vitelatest my-vue-app --template vue-ts# npm 7, extra double-dash is needed: npm create vitelatest m…

单点登录(SSO)基础

单点登录(SSO, Single Sign-On) 是一种身份认证机制,允许用户在多个独立的应用系统中只进行一次登录操作,即可访问所有授权的应用或服务,而无需每次切换应用时都进行登录。SSO 提高了用户体验的便捷性,同时…

Stable Diffusion绘画 | 插件-Deforum:动态视频生成

Deforum 与 AnimateDiff 不太一样, AnimateDiff 是生成丝滑变化视频的,而 Deforum 的丝滑程度远远没有 AnimateDiff 好。 它是根据对比前面一帧的画面,然后不断生成新的相似图片,来组合成一个完整的视频。 Deforum 的优点在于可…

如何评估和观测 IoTDB 所需的网络带宽?

IoTDB 推荐网络配置监控网络 I/O 一网打尽! 网络数据传输速度太慢?延迟太高? 网络的硬件配置如何确定? 网络流量过大导致拥塞? 在现代计算机系统和应用程序中,网络 I/O 性能是决定整体系统表现的关键因素之…

ansible 配置

目录 1.集群自动化维护工具 ansible 2.ansible管理架构 3.安装ansible 4.Iventory主机模式 5.通过ping验证 6.ansible常用模块 7.命令行模块 7.1command模块 7.2shell模块 7.3scripts模块 7.4file模块 7.5copy模块​ 7.6yum模块 1.集群自动化维护工具 ansibl…

uniapp url取消#

hbuilder uniapp取消hash(#)模式 manifest.json "h5": { "template": "static/index.html", "devServer": { "port": 9290, "https": false }, "…

高校实训产品:动漫和游戏场景AI实训平台建设方案

一、行业背景 随着动漫游戏产业的蓬勃发展,市场对高质量的角色造型设计、场景建模、原画创作以及游戏动画的需求日益增长。动漫游戏产业已成为文化产业的重要组成部分,不仅在国内市场占据重要地位,还在全球范围内展现出强大的竞争力。然而&a…