记一次关于MySQL分页查询的优化方案(聚集索引与非聚集索引)

2023-11-18

最近在工作中,有一段逻辑需要从一张大约70W数据的表中分页查询。

  • 最开始写的SQL是:
SELECT * FROM table_name WHERE 1 = 1 ORDER BY time_column DESC LIMIT 600000, 10;

查询时间大概是:3.687s
在这里插入图片描述

  • 后来优化了一次查询语句如下
SELECT
	* 
FROM
	table_name t1,
	( SELECT index_id FROM table_name t0 WHERE 1 = 1 ORDER BY t0.time_column DESC LIMIT 600000, 10 ) t2 
WHERE
	t1.index_id = t2.index_id;

查询时间大概是:1.510s
在这里插入图片描述

  • 这里是使用的索引字段,经过explain发现,即使使用索引字段,t0表扫描的仍是全表。 此时就考虑使用主键试试,优化如下:
SELECT
	* 
FROM
	table_name t1,
	( SELECT id FROM table_name t0 WHERE 1 = 1 ORDER BY t0.time_column DESC LIMIT 600000, 10 ) t2 
WHERE
	t1.id = t2.id ;

查询时间大概是:0.502s
在这里插入图片描述

从第一步到第二步的优化很多人都使用过,为什么从第二步到第三步依然能大幅度提升性能。这就要从主键和索引的区别说起了。

聚集索引

MySQL中,主键使用的聚集索引,也叫聚簇索引。
一张表中只能有一个聚集索引。聚集索引的叶子结点存的整行的数据,可以通过这个聚集索引直接找到某一行。

非聚集索引

一张表中可以有多个非聚集索引,非聚集索引中叶子结点存的是字段的值,通过这个非聚集索引的键值找到对应的聚集索引字段的值,再通过聚集索引键值找到表的某一行。

看到这里想必大家就看出来了,为什么走聚集索引能够提升这么高的性能。这里只记录我遇到的问题和解决方案,如果大家有兴趣了解更多的聚集索引和非聚集索引的区别,可以去搜索大牛们写的文章,我就不再赘述了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次关于MySQL分页查询的优化方案(聚集索引与非聚集索引) 的相关文章

随机推荐

  • ISP(五) RGB、YUV与YCbCr的概念详解

    一 概念 首先要说明RGB YUV和YCbCr都是人为规定的彩色模型或颜色空间 有时也叫彩色系统或彩色空间 它的用途是在某些标准下用通常可接受的方式对彩色加以描述 1 RGB 红绿蓝 是依据人眼识别的颜色定义出的空间 可表示大部分颜色 但在
  • 浅谈逻辑漏洞中的越权访问漏洞

    越权漏洞 越权访问漏洞示意图 一 越权访问漏洞简介 1 类型 水平越权 通过更换的某个ID之类的身份标识 从而使A账号获得 增删查改 B账号的数据 垂直越权 使用低权限身份的账号 发送高权限账号的请求 获得其高权限的操作 未授权访问 通过删
  • Vue--ElementUI组件库

    1 概述 Element官网 ElementUI是饿了么前端团队推出的一款基于Vue桌面端UI框架 和Boostrap一样对原生的HTML标签进行了封装 美化 让我们能够专注于业务逻辑而不是UI界面 默认情况下无论我们有没有使用到某个组件
  • JVM类加载器的urlclassloader和appclassloader

    package kite jvm import java net URL 首先为什么 1 可以 因为OneURLClassLoader在加载Constant的时候发现需要加载 OneInterface 因为他是其接口 因为OneURLCla
  • merkle tree

    merkle tree 是用来存储hash值的一棵树 其叶子是数据块的hash值 非叶子节点是其对应子节点的串联字符串的hash hash是一个把任意长度数据映射成固定长度的函数 对于数据完整性校验 最简单的方法是对整个数据做Hash运算得
  • elasticsearch对数组进行搜索

    写在前面 我们在进行全文建搜的时候往往会添加很多前置条件 比如地区 时间 以及知识点树 我们需要在搜索之前先进行过滤在进行搜索 Array索引 es的数据类型中实际上是不包含数组类型的 在默认的情况下任何字段都可以包含0或者是更多的值 并且
  • docker配置nginx

    docker配置nginx 1 首先安装nginx镜像 docker pull nginx 安装好可以选择测试 也可以跳过 测试命令两行 docker run name nginx test p 80 80 d nginx docker s
  • OC 6702升压型恒流驱动芯片, ESOP8 封装,内置 100V 功率 MOS

    概述 OC 6702 是一款内置 100V 功率 NMOS 高效率 高精度的升压型大功率 LED 恒流驱动芯片 OC6702 采用固定关断时间的控制方 式 关断时间可通过外部电容进行调节 工作频率可根据用户要求而改变 OC6702 通过调节
  • 判断一个对象是否有空的属性值

    直接上代码 const trim str gt const newStr str 0 str str toString return newStr newStr replace s s g str 判断一个对象是否有空的属性值 const
  • 树莓派配置wifi做热点方法

    http wiki jikexueyuan com project raspberry pi wifi html
  • Java JDK8 Stream 使用详解

    Stream 流 的 筛选 去重 截取跳过映射 合并多个流 匹配 归约 简单示例 1 什么是流 2 流的特点 3 流的操作种类 4 流的操作过程 5 使用流 1 什么是流 流是Java8引入的全新概念 它用来处理集合中的数据 暂且可以把它理
  • [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL s

    背景 想导入一个别人的项目 却发现使用navicat运行数据库批次文件时出现了错误 爆出了这样的错误 Err 1064 You have an error in your SQL syntax check the manual that c
  • uniapp的tab切换自定义组件封装

    一 创建组件 在存放组件的文件夹新建一个 vue文件 二 使用子组件
  • 并不是所有的程序员都适合做技术管理

    CSDN记者 张勇 写在之前 在CSDN博客闲逛时无意间进入一个博客 博客地址 博客里的文章质量很高 文章话题主要涉及程序员素养和管理 文章有翻译也有原创 看了几篇文章之后 突然很想和这篇博名为 呦呦鹿鸣 签名则引用孟子 穷则独善其身 达则
  • js 字符串与二维数组间的转化

    1 字符串转二维数组 var a 1 2 3 4 5 a b c d e y1 y2 y3 y4 y5 var str eval a alert str 0 3 结果 4 2 二维数组转字符串 var b 1 2 a b function
  • 云原生之使用Docker部署Dashdot服务器仪表盘

    云原生之使用Docker部署Dashdot服务器仪表盘 一 Dashdot介绍 二 检查本地系统环境 1 检查本地系统版本 2 检查docker状态 3 检查docker版本 三 下载Dashdot镜像 四 部署Dashdot应用 1 创建
  • oracle存储过程----存储过程执行简单的增删改查sql

    存储过程执行简单的增删改查sql 上一篇文章 oracle存储过程 变量的介绍及使用 PL SQL 下边是一个简单的数据库表 为了方便 我都定义成了varchar 类型 1 存储过程执行增加sql 首先写一个增加的存储过程 create o
  • MQTT学习笔记——MQTT协议使用

    http mosquitto org files source mosquitto 1 4 5 tar gz 安装出错时openssl等 需要更改 cd mosquitto 1 4vi config mk可以选择去掉SSL的功能 可以参考h
  • ES相关随手记

    ES相关随手记 一 基本操作 1 es三大属性 索引 映射 文档 1 1 索引 查看 es 中所有的索引信息 GET cat indices v 创建 索引 PUT products 创建 索引 指定库信息 PUT products set
  • 记一次关于MySQL分页查询的优化方案(聚集索引与非聚集索引)

    最近在工作中 有一段逻辑需要从一张大约70W数据的表中分页查询 最开始写的SQL是 SELECT FROM table name WHERE 1 1 ORDER BY time column DESC LIMIT 600000 10 查询时