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

关于MySQL的limit优化

1、前提

提示:只适用于InnoDB引擎

2、InnoDB存储特点

  • 它把索引和数据放在了一个文件中,就是聚集索引。这与MyISAM引擎是不一样的。
    在这里插入图片描述

3、SQL示例

-- 给cve字段建立索引
select * from cnnvd where cve='CVE-2022-24808' limit 300000,10
  • 由于MySQL内部的执行顺序以及B+树的特性,就导致SQL会先查询300010次普通索引节点,然后拿到300010个聚集索引的指针地址,进而再查询300010次聚集索引,接着得到300010条数据,最终还要舍去前300000条数据,从而得到10条数据。相当于前300000条数据都是没用的,浪费了好多IO。

4、优化

  • 我们可以做以下改变:利用子查询或者关联查询,先得到这10条数据的聚集索引指针地址,然后就只需要查询10次聚集索引就行了,几乎减少了一半的磁盘IO,并且如果limit的第一个参数越大,效率改善就越明显
select * from cnnvd a join (select id from cnnvd where cve='CVE-2022-24808' limit 300000,10) b on a.id = b.id;

5、校验

  • 怎么才能证实MYSQL底层就是这样处理的呢?我们可以在执行完每条SQL后,分别输出下buffer pool中的数据页的大小(第一条SQL完成后要重启MySQL,清空缓存,不然没什么变化),一比就看出来了。
-- 对于第一条SQL的输出结果:
mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('cve_name','primary') and TABLE_NAME like '%cnnvd%' group by index_name;
+------------+----------+
| index_name | count(*) |
+------------+----------+
| cve_name   |      663 |
| PRIMARY    |     5451 |
+------------+----------+
2 rows in set (0.34 sec)-- 对于第二条SQL的输出结果:
mysql> select index_name,count(*) from information_schema.INNODB_BUFFER_PAGE where INDEX_NAME in('cve_name','primary') and TABLE_NAME like '%cnnvd%' group by index_name;
+------------+----------+
| index_name | count(*) |
+------------+----------+
| cve_name   |      663 |
| PRIMARY    |      14  |
+------------+----------+
2 rows in set (0.34 sec)

很明显PRIMARY的数据页的大小变小了好多,因为在查询聚集索引的时候少了很多次查询操作。
其实不用看这个输出,你只要弄一张数据量很大的表测一下,就能很直观的感受到查询效率差别很大,前提是limit的第一个参数特别大的时候越明显。

http://www.lryc.cn/news/12669.html

相关文章:

  • Java-Stream流基本使用
  • Liunx(狂神课堂笔记)
  • 【史上最全面esp32教程】点灯大师篇
  • 【Java 面试合集】内存中为什么要区分栈和堆
  • 【NLP实战】Python字符串处理
  • 17.CSS伪类
  • 数据链路层
  • 投票需要什么流程微信投票互助平台的免费投票平台搭建
  • 数据结构——算法的时间复杂度
  • Go基础-类型
  • 良许翻天覆地的2022年
  • node+vue微信小程序的社区后勤报修系统
  • WSL(Windows Subsystem for Linux)
  • 华为OD机试题 - 单词反转(JavaScript)
  • 人工智能原理复习 | 产生式系统的搜索策略
  • 初始C语言 - 数组(一维数组、二维数组、数组越界、数组传参)
  • 人工智能原理复习 | 可分解产生式系统的搜索策略
  • 线段树(维护区间信息)
  • C语言 基于Ncurse库的贪吃蛇游戏项目
  • 【Java基础】Java语言特性
  • python进阶--Numyp库(一)
  • CV学习笔记-Inception
  • 注意力机制笔记——结合沐神和B站老弓up主
  • 建议收藏,轻松搞懂区块链
  • php设计一个新春祝福墙
  • KubeSphere 社区双周报 | OpenFunction 集成 WasmEdge | 2023.02.03-02.16
  • 数字IC/FPGA 秋招知识点不全面整理
  • 你知道java8是如何排序Map嘛?
  • 【李忍考研传】一、李忍
  • 测牛学堂:软件测试python深入之类和对象的属性和方法总结